Arduino与S7-200 PLC 进行Modbus通信测试

Modbus是一种串行通信协议,Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。例如PLC、变频器、流量计、温湿度、上位机组态软件、各种传感器仪表等。

智慧工厂是现代工厂信息化发展的新阶段。是在数字化工厂的基础上,利用物联网的技术和设备监控技术加强信息管理和服务;清楚掌握产销流程、提高生产过程的可控性、减少生产线上人工的干预、即时正确地采集生产线数据,以及合理的生产计划编排与生产进度。智能网关未来将会被大量使用在生产企业的各个设备之间,通过智慧网关将设备的实时数据上传至云端,利用大数据管理系统帮助企业完成数字化转型。

接线图:

 

 

Modbus RTU 主从/地址设置:

Arduino UNO:  从站   地址为 1

S7-200  224XP:   主站

 

Arduino程序:

arduino库文件下载地址: https://gitee.com/hejinlv/modbus-slave-lib.git

 

 1 #include <modbus.h>
 2 #include <modbusDevice.h>
 3 #include <modbusRegBank.h>
 4 #include <modbusSlave.h>
 5 
 6 #include <SimpleTimer.h>
 7 
 8 volatile int item;
 9 SimpleTimer timer;
10 
11 modbusDevice regBank;
12 modbusSlave slave;              //modbus从站
13 
14 #define RS485TxEnablePin 2      //RS485使能引脚
15 #define RS485Baud 9600          //波特率9600
16 #define RS485Format SERIAL_8E1  //8位 偶校验
17 
18 #define LED1 13
19 #define LED2 12
20 
21 void setup()
22 {
23 
24   //初始化串口
25   slave.setBaud(&Serial, RS485Baud, RS485Format, RS485TxEnablePin);
26   //分配Modbus设备ID。
27   regBank.setId(1);
28 
29 /*30 Modbus寄存器遵循以下格式。
31 00001-09999数字输出,主设备可以读写这些寄存器。
32 10001-19999数字输入,主设备只能从这些寄存器读取值。
33 30001-39999模拟输入,主设备只能从这些寄存器读取值。
34 40001-49999模拟输出,主设备可以读取和写入这些寄存器。
35 
36 模拟值是存储范围为0-32767的16位无符号字。
37 数字值以字节存储,零值为OFF,任何非零值为ON。
38 
39 */
40   //将模拟输入寄存器添加到寄存器组
41   regBank.add(30001);
42   regBank.add(30002);
43 
44   //将模拟输出寄存器添加到寄存器组
45   regBank.add(40001);
46   regBank.add(40002);
47 
48   slave._device = &regBank;
49   //设置引脚模式
50   pinMode(LED1, OUTPUT);
51   pinMode(LED2, OUTPUT);
52   //设置定时器  每秒执行一次
53   timer.setInterval(1000L, Simple_timer_1);
54 }
55 
56 void loop()
57 {
58   //读取40001寄存的值
59   digitalWrite(LED1, regBank.get(40001));
60   digitalWrite(LED2, regBank.get(40002));
61   
62   //向30001寄存器写入数据
63   regBank.set(30001, (word) (99 - item)); //from 99 - 0
64   regBank.set(30002, (word) item); //from 0 - 99
65   
66   //Modbus从站程序运行
67   slave.run();
68   
69   //简单定时器运行
70   timer.run();
71 }
72 
73 //定时器执行函数
74 void Simple_timer_1() {
75   item = item + 1;
76   if (item == 99) {
77     item = 0;
78   }
79 
80 }

 

S7-200 PLC 程序:(主站轮询读写)

 

 

 

 

 

 

 

 

 

 

测试结果如下:

数据通讯正常

 

 

(未完......持续更新)

(下一步将测试 SIMATIC S7-1200 -- Arduino、ESP32、STM32.....)

posted @ 2021-04-09 10:39  GeGeBoom  阅读(2968)  评论(8编辑  收藏  举报