弘毅 发表于 2016-4-8 14:57:22

S-100 485 MODBUS RTU Slave介绍

本帖最后由 弘毅 于 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; // 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 = 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;
        holdingRegs = In13;
        holdingRegs = In14;
        holdingRegs = In15;
        holdingRegs = In16;
        holdingRegs = In17;
        holdingRegs = In18;
        holdingRegs = In19;
        // 读取输出寄存器状态
        byte Out2 = holdingRegs;
        byte Out3 = holdingRegs;
        byte Out4 = holdingRegs;
        byte Out5 = holdingRegs;
        byte Out6 = holdingRegs;
        byte Out7 = holdingRegs;
        byte Out8 = holdingRegs;
        byte Out9 = holdingRegs;
        //将输出寄存器的配置输出到端口
        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对应的继电器就会开启。

http://player.youku.com/player.php/sid/XMTU2NDg0NTIyMA==/v.swf

用到的MODBUS库下载:

zix 发表于 2016-4-24 15:05:01

如果用arduino做主机怎么做呢?

zix 发表于 2016-4-24 15:05:35

如果用arduino做主机控制要如何控制呢

弘毅 发表于 2016-4-24 23:03:47

zix 发表于 2016-4-24 15:05 static/image/common/back.gif
如果用arduino做主机控制要如何控制呢

这个库里有主机的。。。可以瞄瞄,教程得后面抽空才有时间写

suoma 发表于 2016-7-13 09:08:41

加继电器可以控制变频器了,多少钱?

弘毅 发表于 2016-7-13 15:53:36

suoma 发表于 2016-7-13 09:08 static/image/common/back.gif
加继电器可以控制变频器了,多少钱?

128

Cimate 发表于 2016-7-15 15:55:44

请问485上的电阻开关有什么用的?

弘毅 发表于 2016-7-15 16:01:08

Cimate 发表于 2016-7-15 15:55 static/image/common/back.gif
请问485上的电阻开关有什么用的?

终端电阻,可以看485总线物理层介绍。

natsu314 发表于 2016-7-20 17:36:01

下載庫編譯不過呢:'(

Cimate 发表于 2016-7-21 10:04:16

我想问的是,你那个485是通过TTL然后接一个MAX485芯片的吧,我记得这个芯片要通过一个IO来切换是发送和接收的

natsu314 发表于 2016-7-21 15:48:58

我也想問如何利用arduino nano 擴充 RS485 ,能讓nano 作為SlAVE 擷取到的數據,透過MODBUS 格式傳輸 有加上CRC 檢查碼

弘毅 发表于 2016-7-21 22:41:54

natsu314 发表于 2016-7-21 15:48 static/image/common/back.gif
我也想問如何利用arduino nano 擴充 RS485 ,能讓nano 作為SlAVE 擷取到的數據,透過MODBUS 格式傳輸 有加上 ...

需要485模块和对应的库了

natsu314 发表于 2016-7-25 00:14:24

弘毅 发表于 2016-7-21 22:41 static/image/common/back.gif
需要485模块和对应的库了

我已經有 RS485模塊但CRC總是不成,想詢問弘毅大是否有建議學習的庫或範例?

弘毅 发表于 2016-8-4 16:58:52

natsu314 发表于 2016-7-25 00:14 static/image/common/back.gif
我已經有 RS485模塊但CRC總是不成,想詢問弘毅大是否有建議學習的庫或範例?

没。。。我也没找到特别好用的,估计只能自己写了。

natsu314 发表于 2016-8-19 17:14:42

弘毅 发表于 2016-8-4 16:58 static/image/common/back.gif
没。。。我也没找到特别好用的,估计只能自己写了。

謝謝您我已經處理完畢了^^
页: [1] 2
查看完整版本: S-100 485 MODBUS RTU Slave介绍