极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 35036|回复: 10

Arduino Modbus Slave Rs485

[复制链接]
发表于 2014-2-7 13:41:37 | 显示全部楼层 |阅读模式
各位前輩大家好,我是位剛剛接觸arduino的新人

我得目標是想透過讓arduino作為slave透過RS485orRS232來跟其他設備溝通

這段code是我在官方論壇裡面找到的,我用modscan32去 連線baud rate 9600 8N1  ID1 透過arduino本來的USB port 確實可以讀
寫資料成功,http://i.imgur.com/KYaXI07.jpg?1   http://i.imgur.com/gRMd3Hd.jpg?1

但是想試著用板上的rx tx 走 RS485以及RS232  再用modscan32 卻都連線不到了

1.arduino板上的RX TX 訊號格式是TTL 因此我買了個 ttl轉rs232的模塊http://goods.ruten.com.tw/item/show?21108295262738
2.我仿照這張圖http://dereenigne.org/wp-content/uploads/modbus.png 做了個轉換的電路http://i.imgur.com/NffJGNY.jpg?1

但以上兩種方式都通訊失敗
後來我直接去官方下載SimpleModbusSlave的範例 一樣沒辦法建立起連線https://code.google.com/p/simple-modbus/
請問各位前輩能給點建議嗎? 非常的感激

#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

/* PINS
Add more registers if needed
Digital input pins 2,3,4,5,6,7
Digital output pins 8,9,12,13
Analog output pins 10,11 (PWM)
Analog input pins 0,1,2,3,4,5
*/


modbusDevice regBank;
modbusSlave slave;

int AI0,AI1,AI2,AI3,AI4,AI5;


void setup()
{   
  regBank.setId(1); ///Set Slave ID

//Add Digital Input registers
  regBank.add(10002);
  regBank.add(10003);
  regBank.add(10004);
  regBank.add(10005);
  regBank.add(10006);
  regBank.add(10007);
// Add Digital Output registers
  regBank.add(8);
  regBank.add(9);
  regBank.add(12);
  regBank.add(13);
//Analog input registers
  regBank.add(30001);
  regBank.add(30002);
  regBank.add(30003);
  regBank.add(30004);
  regBank.add(30005);
  regBank.add(30006);
//Analog Output registers
  regBank.add(40010);  
  regBank.add(40011);  

  slave._device = &regBank;  
  slave.setBaud(9600);   
  
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(6,INPUT);
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
   
}
void loop(){

  while(1){   
  //Digital Input
    byte DI2 = digitalRead(2);
    if (DI2 >= 1)regBank.set(10002,1);
    if (DI2 <= 0)regBank.set(10002,0);
    byte DI3 = digitalRead(3);
    if (DI3 >= 1)regBank.set(10003,1);
    if (DI3 <= 0)regBank.set(10003,0);
    byte DI4 = digitalRead(4);
    if (DI4 >= 1)regBank.set(10004,1);
    if (DI4 <= 0)regBank.set(10004,0);
    byte DI5 = digitalRead(5);
    if (DI5 >= 1)regBank.set(10005,1);
    if (DI5 <= 0)regBank.set(10005,0);
    byte DI6 = digitalRead(6);
    if (DI6 >= 1)regBank.set(10006,1);
    if (DI6 <= 0)regBank.set(10006,0);
    byte DI7 = digitalRead(7);
    if (DI7 >= 1)regBank.set(10007,1);
    if (DI7 <= 0)regBank.set(10007,0);
                                
  //Digital output
    int DO8 = regBank.get(8);
      if (DO8 <= 0 && digitalRead(8) == HIGH)digitalWrite(8,LOW);
      if (DO8 >= 1 && digitalRead(8) == LOW)digitalWrite(8,HIGH);
    int DO9 = regBank.get(9);
      if (DO9 <= 0 && digitalRead(9) == HIGH)digitalWrite(9,LOW);
      if (DO9 >= 1 && digitalRead(9) == LOW)digitalWrite(9,HIGH);
    int DO12 = regBank.get(12);
      if (DO12 <= 0 && digitalRead(12) == HIGH)digitalWrite(12,LOW);
      if (DO12 >= 1 && digitalRead(12) == LOW)digitalWrite(12,HIGH);
    int DO13 = regBank.get(13);
      if (DO13 <= 0 && digitalRead(13) == HIGH)digitalWrite(13,LOW);
      if (DO13 >= 1 && digitalRead(13) == LOW)digitalWrite(13,HIGH);
            
  //Analog input  ***READ Twice deliberately
    AI0 = analogRead(0);
    delay(10);
    AI0 = analogRead(0);
    regBank.set(30001, (word) AI0);
    delay(10);
   
    AI1 = analogRead(1);
    delay(10);
    AI1 = analogRead(1);
    regBank.set(30002, (word) AI1);
    delay(10);
   
    AI2 = analogRead(2);
    delay(10);
    AI2 = analogRead(2);
    regBank.set(30003, (word) AI2);
    delay(10);
   
    AI3 = analogRead(3);
    delay(10);
    AI3 = analogRead(3);
    regBank.set(30004, (word) AI3);
    delay(10);
   
    AI4 = analogRead(4);
    delay(10);
    AI4 = analogRead(4);
    regBank.set(30005, (word) AI4);
    delay(10);
   
    AI5 = analogRead(5);
    delay(10);
    AI5 = analogRead(5);
    regBank.set(30006, (word) AI5);
    delay(10);
        
  //Analog output
    word AO10 = regBank.get(40010);
    analogWrite(10,AO10);
    delay(10);
    word AO11 = regBank.get(40011);
    analogWrite(11,AO11);
    delay(10);
        
  slave.run();  
  }
}

回复

使用道具 举报

发表于 2014-8-10 20:32:57 | 显示全部楼层
您好!请问您的MODBUS 通讯弄好了吗?能分享一下你的MODBUS Slave Rs485相关的库文件吗?谢谢! [email protected]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-18 16:38:27 | 显示全部楼层
luckly 发表于 2014-8-10 20:32
您好!请问您的MODBUS 通讯弄好了吗?能分享一下你的MODBUS Slave Rs485相关的库文件吗?谢谢!

http://forum.arduino.cc/index.php?topic=213432.15

這個作者有提供 library&範例
回复 支持 反对

使用道具 举报

发表于 2014-12-26 10:37:20 | 显示全部楼层
platoxii 发表于 2014-12-18 16:38
http://forum.arduino.cc/index.php?topic=213432.15

這個作者有提供 library&範例

谢谢!前段时间下载到库文件,解决了!
回复 支持 反对

使用道具 举报

发表于 2015-6-5 12:03:54 | 显示全部楼层

您好!请问您的MODBUS 通讯弄好了吗?能分享一下你的MODBUS Slave Rs485相关的库文件吗?谢谢! [email protected]
回复 支持 反对

使用道具 举报

发表于 2016-4-16 17:28:24 | 显示全部楼层
luckly 发表于 2014-12-26 10:37
谢谢!前段时间下载到库文件,解决了!

您好,方便把您的库文件给我发一份吗。谢谢

邮箱[email protected]
回复 支持 反对

使用道具 举报

发表于 2016-7-25 00:20:41 | 显示全部楼层
luckly 发表于 2014-12-26 10:37
谢谢!前段时间下载到库文件,解决了!

您好  請問您slave modbus 通訊用好了嗎 ? 方便傳給我研究一下~謝謝
[email protected]
回复 支持 反对

使用道具 举报

发表于 2016-7-26 15:28:30 | 显示全部楼层

根据这个图,你的D2应该是输出引脚,需要控制max485进行收发模式转换用
回复 支持 反对

使用道具 举报

发表于 2018-2-1 14:25:26 | 显示全部楼层
楼主,方便把库给我吗?谢谢!邮箱:[email protected]
回复 支持 反对

使用道具 举报

发表于 2018-2-2 00:16:49 来自手机 | 显示全部楼层
楼主,可以加QQ吗?18476403
回复 支持 反对

使用道具 举报

发表于 2018-9-12 17:12:02 | 显示全部楼层
luckly 发表于 2014-12-26 10:37
谢谢!前段时间下载到库文件,解决了!

你好,可以发一下库文件给我吗?[email protected] ,感激不尽
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 11:21 , Processed in 0.048217 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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