使用arduino通过Modbus 控制变频器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6005|回复: 6

使用arduino通过Modbus 控制变频器

[复制链接]
发表于 2021-4-22 22:19 | 显示全部楼层 |阅读模式
本帖最后由 yangminglin 于 2021-4-27 21:06 编辑

自己瞎琢磨arduino已经好几年了,我自己又是干变频器售后的,就寻思着使用NANO通过modbus来控制变频器的启停,读取数据等操作,这样可以把部分复杂的控制过程转移到NANO上,但是自己基础又差,很多都是靠复制粘贴,来慢慢凑功能,前段时间看了一下@GeGeBoom写的https://www.arduino.cn/forum.php ... 63&highlight=MODBUS这篇文章,刚好这些东西我都有,就按照他的教程一步一步来,结果真的通讯上了,但这是从站的程序,我想做的是主站,后来加他QQ,向他请教相关的知识,他很热情的给我讲解,后有给我发了两篇帖子,借鉴这些内容成功的和变频器通讯上了,个人觉得还是可以把自己综合出来的内容给大家分享一下,也希望有大神可以指点优化一下。
借鉴内容地址1:https://www.yiboard.com/thread-1189-1-1.html
借鉴内容地址2:https://blog.csdn.net/ouyangxin95/article/details/77887498

接线和模块如下图:

接线图.png
使用变频器:森兰SB70系列,也就是我们自己的产品,如果其它品牌变频器,只需在程序里修改地址即可。

以下是代码
  1. //https://www.yiboard.com/thread-1189-1-1.html原资料

  2. #include <SoftwareSerial.h>     //软串口库
  3. #include <ModbusMaster.h>       //MODBUS主站库

  4. #define MAX485_DE      10       //定义MAX485 TTL到RS-485转换器模块和Arduino UNO之间连接的引脚名称
  5. #define MAX485_RE_NEG  11

  6. ModbusMaster node;              //初始化类ModbusMaster的节点对象
  7. SoftwareSerial mySerial1(8,9);  //初始化软串口 TX:8  RX:9

  8. //int hz,dcv;
  9. uint16_t vfd_1_data[9];
  10. /*****************************************************
  11. vfd_1_data[0]主状态字
  12. vfd_1_data[1]运行频率
  13. vfd_1_data[2]算术单元1输出
  14. vfd_1_data[3]算术单元2输出
  15. vfd_1_data[4]给定频率
  16. vfd_1_data[5]输出电流
  17. vfd_1_data[6]输出转矩
  18. vfd_1_data[7]输出电压
  19. vfd_1_data[8]母线电压
  20. *****************************************************/

  21. void preTransmission()//使Max485 TTL到RS-485转换器模块的引脚RE和DE高或低为发送或接收数据,高电平为数据发送使能。
  22. {
  23.   digitalWrite(MAX485_RE_NEG, 1);
  24.   digitalWrite(MAX485_DE, 1);
  25. }

  26. void postTransmission()//使Max485 TTL到RS-485转换器模块的引脚RE和DE高或低为发送或接收数据,低电平为数据接收使能。
  27. {
  28.   digitalWrite(MAX485_RE_NEG, 0);
  29.   digitalWrite(MAX485_DE, 0);
  30. }

  31. void setup() {
  32.   mySerial1.begin(9600); //初始化软串口波特率
  33.   Serial.begin(9600);
  34. // node.begin(1, Serial);   //定义发送数据的串口号
  35.   node.begin(1, mySerial1);  //定义发送数据的串口号本程序使用软串口与变频器通讯,使用自带串口监视数据。
  36.   node.preTransmission(preTransmission);
  37.   node.postTransmission(postTransmission);

  38.   pinMode(MAX485_RE_NEG, OUTPUT);//然后将RE和DE引脚设置为OUTPUT引脚。
  39.   pinMode(MAX485_DE, OUTPUT);
  40.   pinMode(4,INPUT);//将引脚4和5设置为INPUT引脚(按钮)。
  41.   pinMode(5,INPUT);
  42.   pinMode(A4, INPUT_PULLUP);//将引脚A4和A5设置为INPUT上拉引脚。
  43.   pinMode(A5, INPUT_PULLUP);

  44.   digitalWrite(MAX485_RE_NEG, 0);//最初,MAX-485 TTL到RS-485转换器模块的DE和RE引脚设置为低电平
  45.   digitalWrite(MAX485_DE, 0);
  46.   
  47. }


  48. void loop() {

  49. if (0 == digitalRead(A4))
  50.   {
  51.     vfd_run();
  52.   }

  53. if (0 == digitalRead(A5))
  54.   {
  55.     vfd_stop();
  56.   }

  57. vfd_rx();
  58. delay(2000);

  59. }





  60. void vfd_run()//变频器正转运行
  61. {
  62.   node.writeSingleRegister(0x3200,63);//发送数据(地址16进制,数据值)   
  63. }

  64. void vfd_stop()//变频器停止运行
  65. {  
  66.   node.writeSingleRegister(0x3200,62);//发送数据(地址16进制,数据值)   
  67. }


  68. void vfd_rx()
  69. {
  70.   uint8_t j, zjl;
  71.   zjl = node.readHoldingRegisters(0x3210, 9);//读取数据(地址16进制,读取数据长度)
  72.     if (zjl == node.ku8MBSuccess)
  73.     {
  74.         for (j = 0; j < 9; j++)
  75.         {
  76.             vfd_1_data[j] = node.getResponseBuffer(j);
  77.             Serial.print(j);
  78.             Serial.print(" :  ");
  79.             Serial.println(vfd_1_data[j]);
  80.         }
  81.     }
  82. }

复制代码


发表于 2021-6-17 15:30 | 显示全部楼层
标记一下!
改天学习学习
发表于 2021-6-22 07:32 | 显示全部楼层
我也标记一下,或许还能和触摸屏、plc、智能仪表通讯,实现更多功能。
发表于 2021-7-4 07:04 | 显示全部楼层
本帖最后由 tv998 于 2021-7-8 22:34 编辑

Modbus 关键是 CRC16 校验码计算(如果能有个调用CRC16子程序,计算CRC值例子就好了)

发表于 2021-11-23 00:09 | 显示全部楼层
本帖最后由 wwww168kimo 于 2021-11-23 00:13 编辑

最近買了冰櫃的變頻板跟壓縮機,想用Arduino去驅壓縮機的變頻板,不小心把它啟動了,它會用最低速運轉,為了實驗它,還買了萬用變頻板測試儀,用測試儀它都沒問題,可調速度,改用Arduino去調速,但無法調速,不知前輩是否有辦法?
貼上我的程式碼:
int pin = 11;
void setup() {
  pinMode(pin, OUTPUT);
  
}
void loop(){
  digitalWrite(pin, HIGH);
  delayMicroseconds(100);
  digitalWrite(pin, LOW);
  delayMicroseconds(map(analogRead(A1), 0, 1023, 0, 100) - 100);
}
PWM.png
1116.png
发表于 2021-11-23 17:53 | 显示全部楼层
wwww168kimo 发表于 2021-11-23 00:09
最近買了冰櫃的變頻板跟壓縮機,想用Arduino去驅壓縮機的變頻板,不小心把它啟動了,它會用最低速運轉,為 ...

直接使用analogWrite()函数,使用3、5、6、9、10、11引脚都可以
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 06:41 , Processed in 0.093328 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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