|
此程序是CP340 MODBUS RTU主站程序中的一部分,分享出来,供大家参考。
FUNCTION_BLOCK MBUS_MASTER_MSG //功能块名
VAR_INPUT
// Input Parameters //输入参数
INSTRUCTION_ACTIVE : BOOL ; //指令是否激活,真为激活,假为不激活
NEW_REQUEST : BOOL ; //新请求脉冲(设置为 1 时仅对新请求扫描一次)
SLAVE : INT ; //从站地址(0 到 247)
RW : INT ; //读 = 0,写 = 1
ADDR : DINT ; //Modbus 地址(即 00001,10001,20001,40001,400001)
COUNT : INT ; //元素个数(1 到 120 个字或 1 到 1920 位)
MBUS_BUFFER_DB : BLOCK_DB ; //MODBUS缓冲区数据块
MBUS_POINTER_DB : BLOCK_DB ; //MODBUS读写数据块
MBUS_POINTER_BYTE : INT ; //MODBUS读写字节地址
END_VAR
VAR_OUTPUT
// Output Parameters //输出参数
DONE : BOOL ; //完成标志脉冲(0 = 忙,1 = 完成)
ERROR : BYTE ; //错误(00无错误,03接收超时,04输入参数错误,05Modbus未激活,06忙 其它指令在工作,08接收数据长度与预计长度不符,0A发送错误,0B接收错误,)
MBUS_SEND_STATUS : WORD ; //发送指令错误规范(0 = 无错误)
MBUS_REV_STATUS : WORD ; //接收指令错误规范(0 = 无错误)
END_VAR
VAR
// Static Variables //静态局部变量
RetryCount : INT ; //当前已处理重试次数
Broadcast : BOOL ; //广播位
Send_LEN : INT ; //发送数据的长度
Expected_Length : INT ; //接收数据的预计长度
Rev_LEN : INT ; //接收数据的长度
DB_POINTER : INT ; //数据指针
CRC_INDEX : INT ; //CRC校验用索引
CRC_BIT : INT ; //CRC校验用位移位次数
CRC_LSB : BOOL ; //CRC校验用最低有效位
END_VAR
//CRC校验,将从MBUS_BUFFER_DB数据块的第0个字节开始,一直到发送的最后一个字节
MBUS_BUFFER_DB.DW268 := WORD#16#FFFF; //CRC寄存器的初始化
FOR CRC_INDEX := 0 TO ( Send_LEN - 1 ) BY 1 DO
MBUS_BUFFER_DB.DB269 := MBUS_BUFFER_DB.DB[CRC_INDEX] XOR MBUS_BUFFER_DB.DB269 ; //信息字节与当前CRC最低有效字节异或
FOR CRC_BIT := 0 TO 7 BY 1 DO
CRC_LSB := MBUS_BUFFER_DB.DX269.0 ; //将CRC最低有效位保存起来,用于之后的判断
MBUS_BUFFER_DB.DW268 := SHR ( IN := MBUS_BUFFER_DB.DW268 , N := 1 ) ; //右移
IF CRC_LSB = TRUE THEN //如果CRC_LSB位为真
MBUS_BUFFER_DB.DW268 := MBUS_BUFFER_DB.DW268 XOR WORD#16#A001 ; //与多项式异或
END_IF;
END_FOR;
END_FOR;
MBUS_BUFFER_DB.DW268 := ROL ( IN := MBUS_BUFFER_DB.DW268 , N := 8 ) ; //CRC循环左移,相当于交换高低字节
MBUS_BUFFER_DB.DW[ Send_LEN ] := MBUS_BUFFER_DB.DW268 ; //将CRC校验传到缓冲区
目前已经实现plc采用TCP开放式通信连接串口服务器,再在串口上实现MODBUS RTU通信,过些天再来分享。
|
|