• 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.....)

  • 相关阅读:
    简单入门Kubernetes
    什么是知识
    Kubernetes的安装
    Netty简单使用
    Hystrix 容错处理
    一文总结之MyBatis
    基于协同过滤算法的电影推荐系统 利用修正的余弦相似度算法做影片推荐。
    linux 常用命令记录
    orcale增量全量实时同步mysql可支持多库使用Kettle实现数据实时增量同步
    ThreadUtil 多线程处理List,回调处理具体的任务
  • 原文地址:https://www.cnblogs.com/GeGeBoom/p/14636133.html
Copyright © 2020-2023  润新知