使用arduino通过Modbus 控制变频器
本帖最后由 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_NEG11
ModbusMaster node; //初始化类ModbusMaster的节点对象
SoftwareSerial mySerial1(8,9);//初始化软串口 TX:8RX:9
//int hz,dcv;
uint16_t vfd_1_data;
/*****************************************************
vfd_1_data主状态字
vfd_1_data运行频率
vfd_1_data算术单元1输出
vfd_1_data算术单元2输出
vfd_1_data给定频率
vfd_1_data输出电流
vfd_1_data输出转矩
vfd_1_data输出电压
vfd_1_data母线电压
*****************************************************/
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 = node.getResponseBuffer(j);
Serial.print(j);
Serial.print(" :");
Serial.println(vfd_1_data);
}
}
}
标记一下!
改天学习学习 :handshake学习学习 我也标记一下,或许还能和触摸屏、plc、智能仪表通讯,实现更多功能。 本帖最后由 tv998 于 2021-7-8 22:34 编辑
Modbus 关键是 CRC16 校验码计算(如果能有个调用CRC16子程序,计算CRC值例子就好了)
本帖最后由 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);
}
wwww168kimo 发表于 2021-11-23 00:09
最近買了冰櫃的變頻板跟壓縮機,想用Arduino去驅壓縮機的變頻板,不小心把它啟動了,它會用最低速運轉,為 ...
直接使用analogWrite()函数,使用3、5、6、9、10、11引脚都可以
页:
[1]