|
本帖最后由 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
接线和模块如下图:
使用变频器:森兰SB70系列,也就是我们自己的产品,如果其它品牌变频器,只需在程序里修改地址即可。
以下是代码- //https://www.yiboard.com/thread-1189-1-1.html原资料
- #include <SoftwareSerial.h> //软串口库
- #include <ModbusMaster.h> //MODBUS主站库
- #define MAX485_DE 10 //定义MAX485 TTL到RS-485转换器模块和Arduino UNO之间连接的引脚名称
- #define MAX485_RE_NEG 11
- ModbusMaster node; //初始化类ModbusMaster的节点对象
- SoftwareSerial mySerial1(8,9); //初始化软串口 TX:8 RX:9
- //int hz,dcv;
- uint16_t vfd_1_data[9];
- /*****************************************************
- vfd_1_data[0]主状态字
- vfd_1_data[1]运行频率
- vfd_1_data[2]算术单元1输出
- vfd_1_data[3]算术单元2输出
- vfd_1_data[4]给定频率
- vfd_1_data[5]输出电流
- vfd_1_data[6]输出转矩
- vfd_1_data[7]输出电压
- vfd_1_data[8]母线电压
- *****************************************************/
- void preTransmission()//使Max485 TTL到RS-485转换器模块的引脚RE和DE高或低为发送或接收数据,高电平为数据发送使能。
- {
- digitalWrite(MAX485_RE_NEG, 1);
- digitalWrite(MAX485_DE, 1);
- }
- void postTransmission()//使Max485 TTL到RS-485转换器模块的引脚RE和DE高或低为发送或接收数据,低电平为数据接收使能。
- {
- digitalWrite(MAX485_RE_NEG, 0);
- digitalWrite(MAX485_DE, 0);
- }
- void setup() {
- mySerial1.begin(9600); //初始化软串口波特率
- Serial.begin(9600);
- // node.begin(1, Serial); //定义发送数据的串口号
- node.begin(1, mySerial1); //定义发送数据的串口号本程序使用软串口与变频器通讯,使用自带串口监视数据。
- node.preTransmission(preTransmission);
- node.postTransmission(postTransmission);
- pinMode(MAX485_RE_NEG, OUTPUT);//然后将RE和DE引脚设置为OUTPUT引脚。
- pinMode(MAX485_DE, OUTPUT);
- pinMode(4,INPUT);//将引脚4和5设置为INPUT引脚(按钮)。
- pinMode(5,INPUT);
- pinMode(A4, INPUT_PULLUP);//将引脚A4和A5设置为INPUT上拉引脚。
- pinMode(A5, INPUT_PULLUP);
-
- digitalWrite(MAX485_RE_NEG, 0);//最初,MAX-485 TTL到RS-485转换器模块的DE和RE引脚设置为低电平
- digitalWrite(MAX485_DE, 0);
-
- }
- void loop() {
- if (0 == digitalRead(A4))
- {
- vfd_run();
- }
-
- if (0 == digitalRead(A5))
- {
- vfd_stop();
- }
- vfd_rx();
- delay(2000);
-
- }
- void vfd_run()//变频器正转运行
- {
- node.writeSingleRegister(0x3200,63);//发送数据(地址16进制,数据值)
- }
- void vfd_stop()//变频器停止运行
- {
- node.writeSingleRegister(0x3200,62);//发送数据(地址16进制,数据值)
- }
- void vfd_rx()
- {
- uint8_t j, zjl;
- zjl = node.readHoldingRegisters(0x3210, 9);//读取数据(地址16进制,读取数据长度)
- if (zjl == node.ku8MBSuccess)
- {
- for (j = 0; j < 9; j++)
- {
- vfd_1_data[j] = node.getResponseBuffer(j);
- Serial.print(j);
- Serial.print(" : ");
- Serial.println(vfd_1_data[j]);
- }
- }
- }
复制代码
|
|