用户工具

站点工具


ocrobot:microcontroller:s-100:tutorial01

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
ocrobot:microcontroller:s-100:tutorial01 [2018/10/27 02:35] 弘毅ocrobot:microcontroller:s-100:tutorial01 [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1
行 1: 行 1:
 +====== 使用S-100作为485 MODBUS RTU Slave设备使用 ======
 +
 +首先我们要把下面的从机代码通过IDE烧录进入S-100(注意需将本文底部库文件正确解压缩至arduino编译环境libraries目录下)。
 +
 +<code cpp>
 +#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,使能脚(本设备自动使能请勿修改),超时时间【根据实际情况取值0-3000】单位毫秒)
 + */
 + 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);
 +}</code>
 +
 +{{:ocrobot:microcontroller:s-100:485_modbus_slave_7.png?nolink|}}
 +
 +上位机部分我们使用Modbus Poll这个软件来展示一下,怎样通过PC来控制S-100。大家也可以使用其他标准的符合MODBUS RTU协议的软件来进行控制。
 +
 +我们打开软件,在Connection菜单中选择Connect,跳出来配置界面。
 +
 +根据你的实际情况,配置端口。比如现在我们工作在COM30端口,Mode记得选择为RTU。
 +
 +{{:ocrobot:microcontroller:s-100:485_modbus_slave_1.png?nolink|}}
 +
 +{{:ocrobot:microcontroller:s-100:485_modbus_slave_2.png?nolink|}}
 +
 +在Setup菜单栏,我们打开Read/Write Definition配置。
 +
 +这里我们要注意的是,Slave ID,我们要设置为1,地址起始位是0,总共16个地址。
 +
 +{{:ocrobot:microcontroller:s-100:485_modbus_slave_3.png?nolink|}}
 +
 +{{:ocrobot:microcontroller:s-100:485_modbus_slave_4.png?nolink|}}
 +
 +配置好以后。。。我们就会看到软件中出来下图的界面。
 +
 +{{:ocrobot:microcontroller:s-100:485_modbus_slave_5.png?nolink|}}
 +
 +按照下位机源码,我们把每个地址的接口标注出来,这样后期好用一些。
 +
 +{{:ocrobot:microcontroller:s-100:485_modbus_slave_6.png?nolink|}}
 +
 +这时当我们在D12-D19接入高电平时,软件中该地址的状态就会变为1.
 +
 +我们点击右键,在D2-D9中把值改为1,S-100对应的继电器就会开启。
 +
 +{{http://video.ocrobot.com/2016061601.mp4?900x500|}}
 +
 +<WRAP left round download 100%>
 +{{:ocrobot:microcontroller:s-100:simplemodbusng.zip|SimpleModbus库}}
 +\\ {{ :ocrobot:microcontroller:s-100:modbuspollsetup32bit.zip |Modbus Poll X86(32bit)}}
 +\\ {{ :ocrobot:microcontroller:s-100:modbuspollsetup64bit.zip |Modbus Poll X64(64bit)}}
 +\\ {{ :ocrobot:microcontroller:s-100:modbus_poll_s-100_mbp.zip |Modbus Poll S-100测试配置文件}}
 +</WRAP>
  

Valid HTML5 Valid CSS Driven by DokuWiki