本帖最后由 弘毅 于 2016-5-10 15:37 编辑
S-100是一款8路进8路出带485总线的可编程逻辑控制器。核心使用Atmel MEGA328,Arduino兼容。
MODBUS在工业现场使用非常多,我们来介绍一下怎样把S-100变为一个485 MODBUS从机。
首先看一下S-100的管脚图,大家可以使用DC口24V供电,然后485端子连接电脑的485转USB设备。
首先我们要把下面的从机代码通过IDE烧录进入S-100。
- #include "SimpleModbusSlave.h"
- //分配寄存器地址
- enum
- {
- // 地址从0开始
- IN12, //0
- IN13, //1
- IN14, //..
- IN15,
- IN16,
- IN17,
- IN18,
- IN19,
- OUT2,
- OUT3,
- OUT4,
- OUT5,
- OUT6,
- OUT7,
- OUT8,
- OUT9,
- TOTAL_ERRORS,
- TOTAL_REGS_SIZE
- };
- unsigned int holdingRegs[TOTAL_REGS_SIZE]; // 3和16功能码的寄存器数组
- void setup()
- {
- /* 配置(波特率,ID,使能脚,寄存器大小)
- */
- modbus_configure(115200, 1, 1, TOTAL_REGS_SIZE, 0);
- pinMode(2, OUTPUT);
- pinMode(3, OUTPUT);
- pinMode(4, OUTPUT);
- pinMode(5, OUTPUT);
- pinMode(6, OUTPUT);
- pinMode(7, OUTPUT);
- pinMode(8, OUTPUT);
- pinMode(9, OUTPUT);
- pinMode(19, INPUT);
- pinMode(18, INPUT);
- pinMode(17, INPUT);
- pinMode(16, INPUT);
- pinMode(15, INPUT);
- pinMode(14, INPUT);
- pinMode(13, INPUT);
- pinMode(12, INPUT);
- }
- void loop()
- {
- holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
- /*读取输入IO口*/
- byte In12 = digitalRead(12); // read button states
- byte In13 = digitalRead(13); // read button states
- byte In14 = digitalRead(14); // read button states
- byte In15 = digitalRead(15); // read button states
- byte In16 = digitalRead(16); // read button states
- byte In17 = digitalRead(17); // read button states
- byte In18 = digitalRead(18); // read button states
- byte In19 = digitalRead(19); // read button states
- /*将数据写入寄存器*/
- holdingRegs[IN12] = In12;
- holdingRegs[IN13] = In13;
- holdingRegs[IN14] = In14;
- holdingRegs[IN15] = In15;
- holdingRegs[IN16] = In16;
- holdingRegs[IN17] = In17;
- holdingRegs[IN18] = In18;
- holdingRegs[IN19] = In19;
- // 读取输出寄存器状态
- byte Out2 = holdingRegs[OUT2];
- byte Out3 = holdingRegs[OUT3];
- byte Out4 = holdingRegs[OUT4];
- byte Out5 = holdingRegs[OUT5];
- byte Out6 = holdingRegs[OUT6];
- byte Out7 = holdingRegs[OUT7];
- byte Out8 = holdingRegs[OUT8];
- byte Out9 = holdingRegs[OUT9];
- //将输出寄存器的配置输出到端口
- digitalWrite(2, Out2);
- digitalWrite(3, Out3);
- digitalWrite(4, Out4);
- digitalWrite(5, Out5);
- digitalWrite(6, Out6);
- digitalWrite(7, Out7);
- digitalWrite(8, Out8);
- digitalWrite(9, Out9);
- delay(1);
- }
复制代码
上位机部分我们使用Modbus Poll这个软件来展示一下,怎样通过PC来控制S-100。大家也可以使用其他标准的符合MODBUS RTU协议的软件来进行控制。
我们打开软件,在Connection菜单中选择Connect,跳出来配置界面。
根据你的实际情况,配置端口。比如现在我们工作在COM30端口,Mode记得选择为RTU。
在Setup菜单栏,我们打开Read/Write Definition配置。
这里我们要注意的是,Slave ID,我们要设置为1,地址起始位是0,总共16个地址。
配置好以后。。。我们就会看到软件中出来下图的界面。
按照下位机源码,我们把每个地址的接口标注出来,这样后期好用一些。
这时当我们在D12-D19接入高电平时,软件中该地址的状态就会变为1.
我们点击右键,在D2-D9中把值改为1,S-100对应的继电器就会开启。
用到的MODBUS库下载:
|