目录
前情提要
大家好,我是工控从业时长一坤年的邦邦(鞠躬
//---------------------------------------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------------------//
本需要通过RS485接口,实现 Modbus RTU 通信,选模块时相中了这两款(名称中都带有485字样),由于项目还是招标阶段匆忙选择了较经济的BA这一款。
但是到货后发现BA款只能实现自由口通讯,无法直接使用博图中自带的Modbus RTU相关通讯指令,而HF款是可以可,BA需要自己写 。。。 😶-_- ......
(以后记得用HF的!!!!!
(上图为BA和HA的产品简介,确实BA不支持Modbus)
(上图为博图自带 Modbus RTU相关通讯指令 与 自由口指令)
搜索的资料基本都是对于BA模块的介绍及 Send_P2P / Receive_P2P (自由口发送和接收)两条指令的介绍,对于小白的我来说根本无从下手。。。
后找到一篇关于自由口实现Modbus RTU通讯的文章
⭐传送门:西门子RS485自由口通信Modbus RTU 通信协议_自由口通讯协议-CSDN博客
本文在原帖基础上增加了从站通讯功能,并且附加CRC16校验(原帖没有,但其实搜一下有很多案例)。
由于本人对涉及通讯方面的知识了解较少,能力有限,所以很多通讯错误的报警判断阉割掉了。。
/以能用为目标//以能用为目标//以能用为目标(重要事情说三遍)
//---------------------------------------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------------------//
程序详情
1.主站
FB块的变量定义
主站程序
IF #触发 THEN
// 触发后先将读取完成复位
#读写完成 := 0;
#读写错误 := 0;
#扫描次数 := 0;
#校验信息 := 16#6001;
END_IF;
#扫描次数 := #扫描次数 + 1;
//读写超时
IF #扫描次数 > 10 THEN
#读写完成 := 0;
#读写错误 := 1;
#校验信息 := 16#6002;
RETURN;
END_IF;
REGION _name_
// Statement section REGION
END_REGION
CASE #功能码 OF
1: // Statement section case 1
;
2: // Statement section case 2
;
3: // Statement section case 3
//拼接报文
#临时报文[0] := UINT_TO_BYTE(#从站号);//从站地址
#临时报文[1] := UINT_TO_BYTE(16#03);//功能码
#临时报文[2] := UINT_TO_BYTE(#起始地址 / 256);//起始寄存器高位
#临时报文[3] := UINT_TO_BYTE(#起始地址 MOD 256);//起始寄存器低位
#临时报文[4] := UINT_TO_BYTE(#读写长度 / 256);//寄存器数量高位
#临时报文[5] := UINT_TO_BYTE(#读写长度 MOD 256);//寄存器数量低位
"CRC16校验"(校验字节数 := 6,
校验数据 := #临时报文);
//截取报文
#截取结果 := MOVE_BLK_VARIANT(SRC := #临时报文,
COUNT := 8,
SRC_INDEX := 0,
DEST_INDEX := 0,
DEST => #读取发送报文);
#Send_P2P_Instance(REQ := #触发,
"PORT" := #硬件标识符,
BUFFER := #读取发送报文,
LENGTH := 8,
DONE => #发送完成,
ERROR => #发送错误,
STATUS =>