Arduino与S7-200 PLC 进行Modbus通信测试-Arduino中文社区 - Powered by Discuz!
查看: 1859|回复: 6

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

[复制链接]

该用户从未签到

发表于 2021-4-9 11:12 | 显示全部楼层 |阅读模式
本帖最后由 GeGeBoom 于 2021-4-9 13:51 编辑

Modbus是一种串行通信协议,Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。例如PLC、变频器、流量计、温湿度、上位机组态软件、各种传感器仪表等。
智慧工厂是现代工厂信息化发展的新阶段。是在数字化工厂的基础上,利用物联网的技术和设备监控技术加强信息管理和服务;清楚掌握产销流程、提高生产过程的可控性、减少生产线上人工的干预、即时正确地采集生产线数据,以及合理的生产计划编排与生产进度。智能网关未来将会被大量使用在生产企业的各个设备之间,通过智慧网关将设备的实时数据上传至云端,利用大数据管理系统帮助企业完成数字化转型。
接线图:
Arduino.png
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. #include <SimpleTimer.h>

  6. volatile int item;
  7. SimpleTimer timer;

  8. modbusDevice regBank;
  9. modbusSlave slave;              //modbus从站

  10. #define RS485TxEnablePin 2      //RS485使能引脚
  11. #define RS485Baud 9600          //波特率9600
  12. #define RS485Format SERIAL_8E1  //8位 偶校验

  13. #define LED1 13
  14. #define LED2 12

  15. void setup()
  16. {

  17.   //初始化串口
  18.   slave.setBaud(&Serial, RS485Baud, RS485Format, RS485TxEnablePin);
  19.   //分配Modbus设备ID。
  20.   regBank.setId(1);

  21. /*。
  22. Modbus寄存器遵循以下格式。
  23. 00001-09999数字输出,主设备可以读写这些寄存器。
  24. 10001-19999数字输入,主设备只能从这些寄存器读取值。
  25. 30001-39999模拟输入,主设备只能从这些寄存器读取值。
  26. 40001-49999模拟输出,主设备可以读取和写入这些寄存器。

  27. 模拟值是存储范围为0-32767的16位无符号字。
  28. 数字值以字节存储,零值为OFF,任何非零值为ON。

  29. */
  30.   //将模拟输入寄存器添加到寄存器组
  31.   regBank.add(30001);
  32.   regBank.add(30002);

  33.   //将模拟输出寄存器添加到寄存器组
  34.   regBank.add(40001);
  35.   regBank.add(40002);

  36.   slave._device = &regBank;
  37.   //设置引脚模式
  38.   pinMode(LED1, OUTPUT);
  39.   pinMode(LED2, OUTPUT);
  40.   //设置定时器  每秒执行一次
  41.   timer.setInterval(1000L, Simple_timer_1);
  42. }

  43. void loop()
  44. {
  45.   //读取40001寄存的值
  46.   digitalWrite(LED1, regBank.get(40001));
  47.   digitalWrite(LED2, regBank.get(40002));
  48.   
  49.   //向30001寄存器写入数据
  50.   regBank.set(30001, (word) (99 - item)); //from 99 - 0
  51.   regBank.set(30002, (word) item); //from 0 - 99
  52.   
  53.   //Modbus从站程序运行
  54.   slave.run();
  55.   
  56.   //简单定时器运行
  57.   timer.run();
  58. }

  59. //定时器执行函数
  60. void Simple_timer_1() {
  61.   item = item + 1;
  62.   if (item == 99) {
  63.     item = 0;
  64.   }

  65. }
复制代码


S7-200 PLC 程序:(主站轮询读写)
PLCModbusMaster0K_页面_1.jpg
PLCModbusMaster0K_页面_2.jpg
PLCModbusMaster0K_页面_3.jpg
测试结果如下:
数据通讯正常
Snipaste_2021-04-09_09-20-02.jpg
(未完......持续更新)
(下一步将测试 SIMATIC S7-1200 -- Arduino、ESP32、STM32.....)

签到天数: 2 天

[LV.1]初来乍到

发表于 2021-4-9 12:47 | 显示全部楼层
大神,我正好需要这个,我还想用触摸屏控制这个,能办到不啊?必须收藏

该用户从未签到

 楼主| 发表于 2021-4-9 13:38 | 显示全部楼层
yangminglin 发表于 2021-4-9 12:47
大神,我正好需要这个,我还想用触摸屏控制这个,能办到不啊?必须收藏

应该是可以的

该用户从未签到

发表于 2021-6-23 20:16 | 显示全部楼层
大神太厉害了,我在想可不可以在arduino板上添加第二个软串口,实现更多不同设备的通讯

该用户从未签到

 楼主| 发表于 2021-6-24 11:13 | 显示全部楼层
天逸流火 发表于 2021-6-23 20:16
大神太厉害了,我在想可不可以在arduino板上添加第二个软串口,实现更多不同设备的通讯 ...

可以实现

该用户从未签到

发表于 2021-7-30 23:54 | 显示全部楼层
大神,学习收藏了,非常感谢

该用户从未签到

发表于 2021-8-12 21:54 | 显示全部楼层
请问楼主为啥我下载了加载库时提示为无效库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

继电器断开瞬间esp32重启或者网络断开
继电器断开瞬间esp32重启
主要模块: 芯片ESP32-WROOM-32D 供电用的220V转5V模块,700mA 网络LAN8720A模块 继电
【Arduino】168种传感器系列实验(171)---HLK-V20离线语音模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
【Arduino】168种传感器系列实验(181)---1.3寸OLED液晶屏模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
大佬们,帮帮忙
大佬们,帮帮忙
为什么我写的子程序,单独使用运行没问题,两个程序合起来就只会运行一个程序
OLED 128*64自制可达10000000个选项的菜单(已更新)
OLED 128*64自制可达10000
OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表