极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9341|回复: 6

arduino 使用modbus做工控

[复制链接]
发表于 2016-8-10 13:39:04 | 显示全部楼层 |阅读模式
本帖最后由 陈陈陈 于 2016-8-11 11:09 编辑

arduino 使用modbus做工控
@迷你强
强总之前写过一个modbus slave的帖子,这是我这个帖子的灵感来源
使用的单片机为ATMEGA8 用isp 烧入了optiboot的bootloader之后用于工控场合
关键的芯片图纸如下

如何给ATMEGA8烧入bootloader参见帖子:http://www.geek-workshop.com/thread-25004-1-1.html
如何使用arduino 当成isp 参见帖子:http://www.arduino.cn/thread-1245-1-1.html
Max13487的选用可以让单片机无需调高或者调低485发送使能线,即可直接往485总线发送和接受数据,自动转换的,很高级的。推荐!
MAX706芯片是用来给单片机做复位用的,单片机一旦跑飞,就处于发呆的状态,不会再发出任何信号,这个机制的好处就是单片机发呆超过1.6秒(换句话说呢就是delay也要少用),MAX706就直接强制让单片机重启!很好用的,推荐!
好了前提条件就说完了,我们开始使用这个系统吧。
需要用到的库为:
#include <SimpleModbusSlave.h>
#include <MsTimer2.h>
代码如下

  1. #include<SimpleModbusSlave.h>
  2. #include <MsTimer2.h>
  3. enum
  4. {   
  5.   //这里不好理解的话,你就把modbus的寄存器地址当成是一堆连续的地址,这里就是从零开始的地址位置
  6.   //The first register starts at address 0
  7. IN0,     
  8. IN1,        
  9. IN2,
  10. IN3,
  11. OUT0,
  12. OUT1,
  13. OUT2,
  14. OUT3,  
  15. LED_STATE,
  16. ADDRESS,
  17. TOTAL_ERRORS,
  18.   //leave this one
  19. TOTAL_REGS_SIZE
  20.   //total number of registers for function 3 and 16 share the same register array
  21. };

  22. unsigned int holdingRegs[TOTAL_REGS_SIZE];// function 3 and 16 register array
  23. ////////////////////////////////////////////////////////////

  24. void setup()
  25. {
  26.   /*parameters(long baudrate,
  27.                 unsigned char ID,
  28.                 unsigned char transmit enablepin,
  29.                 unsigned int holding registerssize)
  30.                
  31.     The transmit enable pin is used in half duplex communication to activatea MAX485 or similar
  32.     to deactivate this mode use any value < 2 because 0 & 1 is reservedfor Rx & Tx
  33.   */
  34.   
  35. modbus_configure(9600,1,2,TOTAL_REGS_SIZE,0);  
  36. pinMode(A0, OUTPUT);
  37. pinMode(A1, OUTPUT);
  38. pinMode(A2, OUTPUT);
  39. pinMode(A3, OUTPUT);
  40. pinMode(8, INPUT);
  41. pinMode(9, INPUT);
  42. pinMode(10, INPUT);
  43. pinMode(2, INPUT);
  44.   holdingRegs[OUT0]=1;
  45. holdingRegs[OUT1]=1;
  46. holdingRegs[OUT2]=1;
  47. holdingRegs[OUT3]=1;
  48. pinMode(7, OUTPUT);//看门狗引脚,定时清除用
  49. MsTimer2::set(1000, flash); // 500ms period
  50. MsTimer2::start();
  51. }

  52. void loop()
  53. {
  54. holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);//报错收集
  55. holdingRegs[IN0] = digitalRead(8);
  56. holdingRegs[IN1] = digitalRead(9);
  57. holdingRegs[IN2] = digitalRead(10);
  58. holdingRegs[IN3] = digitalRead(2);// 数据写入holding寄存器
  59. digitalWrite(A0, holdingRegs[OUT0]);
  60. digitalWrite(A1, holdingRegs[OUT1]);
  61. digitalWrite(A2, holdingRegs[OUT2]);
  62. digitalWrite(A3, holdingRegs[OUT3]); //读到的数据往继电器输出
  63. }
  64. void flash()//清除看门狗功能
  65. {
  66. static boolean output = HIGH;
  67. digitalWrite(7, output);
  68. output = !output;
  69. }
复制代码
1.jpg
2.jpg
184C318882E89CAEC3EF5C77182E9D0B.jpg
回复

使用道具 举报

 楼主| 发表于 2016-8-10 13:44:29 | 显示全部楼层
另外板子不卖的。。。。我也是网上买的,质量还可以,还要烧bootloader也是麻烦,所以兄弟们要省心最好直接移步弘毅他们的淘宝,有问题要讨论可以私信644545425 qq,嘿嘿
回复 支持 反对

使用道具 举报

发表于 2016-8-11 08:12:35 | 显示全部楼层
陈陈陈 发表于 2016-8-10 13:44
另外板子不卖的。。。。我也是网上买的,质量还可以,还要烧bootloader也是麻烦,所以兄弟们要省心最好直接 ...

請問板子上哪買的??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-11 11:01:16 | 显示全部楼层
本帖最后由 陈陈陈 于 2016-8-11 11:17 编辑
6881087 发表于 2016-8-11 08:12
請問板子上哪買的??


某宝有个大连赛伟,我不是打广告。。。。。千万别删我帖·····
还是买弘毅他们的好了,烧bootloader什么的 挺费事
回复 支持 反对

使用道具 举报

发表于 2016-8-11 15:42:12 | 显示全部楼层
老老实实用plc,省心稳定。
回复 支持 反对

使用道具 举报

发表于 2016-9-7 22:19:17 | 显示全部楼层
你好,我想使用你们的MODBUS程序。我吧上面的代码进行测试,为什么寄存器里所放的数值只能是0~255。是因为这是输入输出寄存器的原因吗?那如果我需要放至任意的数字,我该怎么设置缓存区,或者是用哪些寄存器来当缓存区?
回复 支持 反对

使用道具 举报

发表于 2020-5-28 12:43:41 | 显示全部楼层
原理图上有网络标号在上面没有体现啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-7-4 20:30 , Processed in 0.054229 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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