极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12512|回复: 21

S-100 485 MODBUS RTU Slave介绍

[复制链接]
发表于 2016-4-8 14:57:22 | 显示全部楼层 |阅读模式
本帖最后由 弘毅 于 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设备。


0.jpg

首先我们要把下面的从机代码通过IDE烧录进入S-100。

  1. #include "SimpleModbusSlave.h"
  2. //分配寄存器地址
  3. enum
  4. {
  5.         // 地址从0开始
  6.         IN12, //0
  7.         IN13, //1
  8.         IN14, //..
  9.         IN15,
  10.         IN16,
  11.         IN17,
  12.         IN18,
  13.         IN19,
  14.         OUT2,
  15.         OUT3,
  16.         OUT4,
  17.         OUT5,
  18.         OUT6,
  19.         OUT7,
  20.         OUT8,
  21.         OUT9,
  22.         TOTAL_ERRORS,
  23.         TOTAL_REGS_SIZE
  24.         };
  25. unsigned int holdingRegs[TOTAL_REGS_SIZE]; // 3和16功能码的寄存器数组
  26. void setup()
  27. {
  28.         /* 配置(波特率,ID,使能脚,寄存器大小)
  29.         */
  30.         modbus_configure(115200, 1, 1, TOTAL_REGS_SIZE, 0);
  31.         pinMode(2, OUTPUT);
  32.         pinMode(3, OUTPUT);
  33.         pinMode(4, OUTPUT);
  34.         pinMode(5, OUTPUT);
  35.         pinMode(6, OUTPUT);
  36.         pinMode(7, OUTPUT);
  37.         pinMode(8, OUTPUT);
  38.         pinMode(9, OUTPUT);
  39.         pinMode(19, INPUT);
  40.         pinMode(18, INPUT);
  41.         pinMode(17, INPUT);
  42.         pinMode(16, INPUT);
  43.         pinMode(15, INPUT);
  44.         pinMode(14, INPUT);
  45.         pinMode(13, INPUT);
  46.         pinMode(12, INPUT);
  47. }
  48. void loop()
  49. {
  50.         holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
  51.         /*读取输入IO口*/
  52.         byte In12 = digitalRead(12); // read button states
  53.         byte In13 = digitalRead(13); // read button states
  54.         byte In14 = digitalRead(14); // read button states
  55.         byte In15 = digitalRead(15); // read button states
  56.         byte In16 = digitalRead(16); // read button states
  57.         byte In17 = digitalRead(17); // read button states
  58.         byte In18 = digitalRead(18); // read button states
  59.         byte In19 = digitalRead(19); // read button states
  60.         /*将数据写入寄存器*/
  61.         holdingRegs[IN12] = In12;
  62.         holdingRegs[IN13] = In13;
  63.         holdingRegs[IN14] = In14;
  64.         holdingRegs[IN15] = In15;
  65.         holdingRegs[IN16] = In16;
  66.         holdingRegs[IN17] = In17;
  67.         holdingRegs[IN18] = In18;
  68.         holdingRegs[IN19] = In19;
  69.         // 读取输出寄存器状态
  70.         byte Out2 = holdingRegs[OUT2];
  71.         byte Out3 = holdingRegs[OUT3];
  72.         byte Out4 = holdingRegs[OUT4];
  73.         byte Out5 = holdingRegs[OUT5];
  74.         byte Out6 = holdingRegs[OUT6];
  75.         byte Out7 = holdingRegs[OUT7];
  76.         byte Out8 = holdingRegs[OUT8];
  77.         byte Out9 = holdingRegs[OUT9];
  78.         //将输出寄存器的配置输出到端口
  79.         digitalWrite(2, Out2);
  80.         digitalWrite(3, Out3);
  81.         digitalWrite(4, Out4);
  82.         digitalWrite(5, Out5);
  83.         digitalWrite(6, Out6);
  84.         digitalWrite(7, Out7);
  85.         digitalWrite(8, Out8);
  86.         digitalWrite(9, Out9);
  87.         delay(1);
  88. }
复制代码


7.png

上位机部分我们使用Modbus Poll这个软件来展示一下,怎样通过PC来控制S-100。大家也可以使用其他标准的符合MODBUS RTU协议的软件来进行控制。

我们打开软件,在Connection菜单中选择Connect,跳出来配置界面。

根据你的实际情况,配置端口。比如现在我们工作在COM30端口,Mode记得选择为RTU。


1.png

2.png

在Setup菜单栏,我们打开Read/Write Definition配置。

这里我们要注意的是,Slave ID,我们要设置为1,地址起始位是0,总共16个地址。


3.png

4.png

配置好以后。。。我们就会看到软件中出来下图的界面。

5.png

按照下位机源码,我们把每个地址的接口标注出来,这样后期好用一些。

6.png

这时当我们在D12-D19接入高电平时,软件中该地址的状态就会变为1.

我们点击右键,在D2-D9中把值改为1,S-100对应的继电器就会开启。




用到的MODBUS库下载:
simplemodbusng-master.zip (37.13 KB, 下载次数: 131)
回复

使用道具 举报

发表于 2016-4-24 15:05:01 | 显示全部楼层
如果用arduino做主机怎么做呢?
回复 支持 反对

使用道具 举报

发表于 2016-4-24 15:05:35 | 显示全部楼层
如果用arduino做主机控制要如何控制呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-24 23:03:47 | 显示全部楼层
zix 发表于 2016-4-24 15:05
如果用arduino做主机控制要如何控制呢

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

使用道具 举报

发表于 2016-7-13 09:08:41 | 显示全部楼层
加继电器可以控制变频器了,多少钱?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-13 15:53:36 | 显示全部楼层
suoma 发表于 2016-7-13 09:08
加继电器可以控制变频器了,多少钱?

128
回复 支持 反对

使用道具 举报

发表于 2016-7-15 15:55:44 | 显示全部楼层
请问485上的电阻开关有什么用的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-15 16:01:08 | 显示全部楼层
Cimate 发表于 2016-7-15 15:55
请问485上的电阻开关有什么用的?


终端电阻,可以看485总线物理层介绍。
回复 支持 反对

使用道具 举报

发表于 2016-7-20 17:36:01 | 显示全部楼层
下載庫編譯不過呢
回复 支持 反对

使用道具 举报

发表于 2016-7-21 10:04:16 | 显示全部楼层
我想问的是,你那个485是通过TTL然后接一个MAX485芯片的吧,我记得这个芯片要通过一个IO来切换是发送和接收的
回复 支持 反对

使用道具 举报

发表于 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
我也想問如何利用arduino nano 擴充 RS485 ,能讓nano 作為SlAVE 擷取到的數據,透過MODBUS 格式傳輸 有加上 ...

需要485模块和对应的库了
回复 支持 反对

使用道具 举报

发表于 2016-7-25 00:14:24 | 显示全部楼层
弘毅 发表于 2016-7-21 22:41
需要485模块和对应的库了

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

使用道具 举报

 楼主| 发表于 2016-8-4 16:58:52 | 显示全部楼层
natsu314 发表于 2016-7-25 00:14
我已經有 RS485模塊  但CRC總是不成,想詢問弘毅大是否有建議學習的庫或範例?

没。。。我也没找到特别好用的,估计只能自己写了。
回复 支持 反对

使用道具 举报

发表于 2016-8-19 17:14:42 | 显示全部楼层
弘毅 发表于 2016-8-4 16:58
没。。。我也没找到特别好用的,估计只能自己写了。

謝謝您  我已經處理完畢了  ^^
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-7-7 20:53 , Processed in 0.061821 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表