1. 单片机 用c语言编写 modbus rtu 通讯怎么写啊 主要是crc 校验部分不知
我刚刚写好.跟PLC连接测试过,可以的.
/***************************************************************
CRC计算方法
1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
8位相异或,把结果放于CRC寄存器;
3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4.如果移出位为0:重复第3步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC;
*****************************************************************/
/****************************************************************************
名称: UART_CRC16_Work()
说明: CRC16校验程序
参数: *CRC_Buf:数据地址
CRC_Leni:数据长度
返回: CRC_Sumx:校验值
*****************************************************************************/
unsigned int UART_CRC16_Work(unsigned char *CRC_Buf,unsigned char CRC_Leni)
{
unsigned char i,j;
unsigned int CRC_Sumx;
CRC_Sumx=0xFFFF;
for(i=0;i<CRC_Leni;i++)
{
CRC_Sumx^=*(CRC_Buf+i);//异或
for(j=0;j<8;j++)
{
if(CRC_Sumx & 0x01)
{
CRC_Sumx>>=1;
CRC_Sumx^=0xA001;
}
else
{
CRC_Sumx>>=1;
}
}
}
return (CRC_Sumx);
}
2. MODBUS RTU通讯协议中,功能码为15、16的请求格式怎么写,各个
功能码16号命令请求格式(从设备地址为1、Modbus功能码16、Modbus寄存器开始地址0、写寄存器个数10):01 10 00 00 00 0A 14 12 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 21 84 93
字节0为从设备ID、字节1为功能码(十六进制)、字节2-3为Modbus寄存器开始地址、字节4-5为寄存器个数、字节6为发送字节个数、字节7-26为发送数据(20个字节)、字节27-28为RCR校验。
功能码15号命令请求格式(从设备地址为1、Modbus功能码15、Modbus寄存器开始地址0、写位变量个数16,即2个字节):01 0F 00 00 00 10 02 01 00 E3 B0
字节0为从设备ID、字节1为功能码(十六进制)、字节2-3为Modbus寄存器开始地址、字节4-5为Modbus寄存器格式、字节6为发送字节个数、字节7-8为发送数据(2个字节即16个位)、字节9-10为CRC校验。
扩展资料
Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。
在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。
Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。大多数Modbus设备通信通过串口EIA-485物理层进行。
参考资料来源:搜狗百科-Modbus通讯协议
3. 求助 给个modbus rtu协议的完整代码 最好附有详细解释 初学者 谢
ModBus常用功能码 (功能码为10进制) 01 READ COIL STATUS 读线圈寄存器 02 READ INPUT STATUS 读状态寄存器03 READ HOLDING REGISTER 读保持寄存器04 READ INPUT REGISTER 读输入寄存器 05 WRITE SINGLE COIL 写单线圈寄存器 06 WRITE SINGLE REGISTER 写单保持寄存器15 WRITE MULTIPLE COIL 写多线圈寄存器16 WRITE MULTIPLE REGISTER 写多保持寄存器。
4. 外行人请求帮助:modbus、rtu、modbus rtu分别是什么
我说个简单点的吧
不是复制的哦
modbus协议是工控行业的标准协议,前身为莫迪康所写,现已被施奈德收购
而modbus分为两种协议
即串口协议(modbus rtu)和网口协议(modbus tcp)协议
一般的工控机只支持rs232或者RS485的串口模式
这个时候工控机的协议栈里就只有modbusRTU协议
当他从串口接收到数据时,会直接根据报文中的数据进行控制
如果需要用modbusTCP协议进行传输,则需要使用带有网口的PLC
具体的帧格式如下
modbus RTU 地址域 功能码 数据 差错校验
modbus TCP 目的地址 协议id 长度 单元号 功能码 数据
简单的说 tcp是由RTU加工而来的
而RTU则是另外一种概念,不包含在modbus协议内
是工控行业对监控设备的简称。