上次出了简单教程之后读者反馈看不清楚,没有参考价值,重新写了一篇文章介绍MODBUS RTU轮询程序。
所需硬件:
S7-1200 PLC (CPU1215C DC/DC/DC) 一个,CB1241通讯板(RS485)一个,USB TO RS485光电隔离USB转换器 一个,PC一台。
所需软件:
TIA Portal V14 SP1,ModbusSlaveSetup rev 6.2.0 64Bit。
编程:
1. 组态:
2. 创建FB块(TP01),数据块(DATA1,非优化)
3. 数据块写入需要的变量:MB_RECEIVE结构组用来放置最终读回的值,MB_ADR数组用来放置MODBUS从站地址,MB_RECEDATA数组用来做数据缓冲区。
4. 在TP01(FB)中编程:此次编程使用MODBUS(RTU)和MODBUS两种方法,实际应用中选一套即可。
1. 在ststic变量中建立变量如下图:
两个通讯程序的区别:
2. 如果使用MB_MASTER方式编程:
//设定轮询的范围,最多读9个从站。也可将>9改成一个变量,那样
//就可以控制轮询的范围可伸缩。
//主站初始化:
//数据转存:这边已三个从站为例。实际可以写多个(例如9个)。
//从站号变量自加
然后在OB1中调用TP01就OK.
图中绿色部分采用MODBUS (RTU)编写,有兴趣的读者可以实验。会有疑问, 为什么REQ上升沿直接写入#AlwaysTRUE。这一点我也没有更好的解释。
不用REQ:=#AlwaysTRUE; 想 使 用 REQ := #Modbus_Comm_Load.DONE OR #Modbus_Comm_Load.ERROR;理论上貌似可以,实际使用中只读一次后 BUZY无限为TRUE;导致无法通讯。
3. 将写好的程序卸载进PLC,将CB1241通讯板(RS485)的引脚 RA(485-)RB(485+) 接入到USB转485控制器上。
打开MODBUS SALVE软件。
创建三个从站。地址是21 22 23
博图中监控数据:
觉得有用请多多支持!
作者简介
不是田苗
目前在楚天科技股份公司 担任 电气工程师。