S7-1200写MODBUS RTU轮询(SCL语言)_数据

上次出了简单教程之后读者反馈看不清楚,没有参考价值,重新写了一篇文章介绍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. 组态:

S7-1200写MODBUS RTU轮询(SCL语言)_数组_02


2. 创建FB块(TP01),数据块(DATA1,非优化)

S7-1200写MODBUS RTU轮询(SCL语言)_从站_03


3. 数据块写入需要的变量:MB_RECEIVE结构组用来放置最终读回的值,MB_ADR数组用来放置MODBUS从站地址,MB_RECEDATA数组用来做数据缓冲区。

S7-1200写MODBUS RTU轮询(SCL语言)_从站_04

 

4. 在TP01(FB)中编程:此次编程使用MODBUS(RTU)和MODBUS两种方法,实际应用中选一套即可。


1. 在ststic变量中建立变量如下图:

S7-1200写MODBUS RTU轮询(SCL语言)_数据_05

两个通讯程序的区别:

S7-1200写MODBUS RTU轮询(SCL语言)_数组_06


2. 如果使用MB_MASTER方式编程:

//设定轮询的范围,最多读9个从站。也可将>9改成一个变量,那样

//就可以控制轮询的范围可伸缩。

S7-1200写MODBUS RTU轮询(SCL语言)_从站_07



//主站初始化:


S7-1200写MODBUS RTU轮询(SCL语言)_数组_08

S7-1200写MODBUS RTU轮询(SCL语言)_从站_09


//数据转存:这边已三个从站为例。实际可以写多个(例如9个)。

S7-1200写MODBUS RTU轮询(SCL语言)_数组_10


//从站号变量自加


S7-1200写MODBUS RTU轮询(SCL语言)_数据_11

S7-1200写MODBUS RTU轮询(SCL语言)_数组_12

S7-1200写MODBUS RTU轮询(SCL语言)_数组_13


然后在OB1中调用TP01就OK.

S7-1200写MODBUS RTU轮询(SCL语言)_从站_14


图中绿色部分采用MODBUS (RTU)编写,有兴趣的读者可以实验。会有疑问, 为什么REQ上升沿直接写入#AlwaysTRUE。这一点我也没有更好的解释。

不用REQ:=#AlwaysTRUE; 想 使 用 REQ := #Modbus_Comm_Load.DONE OR #Modbus_Comm_Load.ERROR;理论上貌似可以,实际使用中只读一次后 BUZY无限为TRUE;导致无法通讯。

S7-1200写MODBUS RTU轮询(SCL语言)_数组_15

 

3. 将写好的程序卸载进PLC,将CB1241通讯板(RS485)的引脚 RA(485-)RB(485+) 接入到USB转485控制器上。

打开MODBUS SALVE软件。

S7-1200写MODBUS RTU轮询(SCL语言)_数据_16


创建三个从站。地址是21 22 23

S7-1200写MODBUS RTU轮询(SCL语言)_从站_17


博图中监控数据:

S7-1200写MODBUS RTU轮询(SCL语言)_数组_18

觉得有用请多多支持!

作者简介

不是田苗

目前在楚天科技股份公司 担任 电气工程师。

S7-1200写MODBUS RTU轮询(SCL语言)_数组_19