Arduino用modbus通讯和硬石模块进行通讯,设置电压及获取电压值
作者:野牛程序员:2024-01-31 17:42:44Arduino阅读 2682
用modbus通讯和硬石模块进行通讯,设置电压及获取电压值
#include <SoftwareSerial.h> #include <ModbusMaster.h> #include <TimerOne.h> // 定义虚拟串口对象并指定引脚 SoftwareSerial mySerial(2, 3); // RX, TX // 定义ModbusMaster对象 //读电压 ModbusMaster modbus1; // 设备1 ModbusMaster modbus2; // 设备2 //写电压 ModbusMaster modbus3; // 设备3 ModbusMaster modbus4; // 设备4 ModbusMaster modbus5; // 设备5 // 定义常量 const unsigned long DAC_UPDATE_INTERVAL = 10000; // DAC更新间隔,单位:毫秒(10秒) const unsigned long ADC_READ_INTERVAL = 20000; // ADC读取间隔,单位:毫秒(15秒) unsigned long currentMillis; // 定义变量 unsigned long previousDACMillis = 0; unsigned long previousADCMillis = 0; uint16_t dacValues[6] = {0, 0, 0, 0, 0, 0}; // 示例的DAC值 uint16_t dac1=7777,dac2=7777,dac3=7777,dac4=7777,dac5=7777,dac6=7777; // 示例的DAC值 uint8_t result; //创建接收缓冲区 // 定时器中断服务程序声明 void timerISR(); void setup() { // 初始化串口通信 Serial.begin(115200,SERIAL_8E1); // 初始化虚拟串口 mySerial.begin(115200); // 设置定时器1 Timer1.initialize(10000); // 初始化定时器1,周期为10毫秒 Timer1.attachInterrupt(timerISR); // 将中断服务程序与定时器1关联 // 初始化Modbus通信,使用虚拟串口 modbus1.begin(1, Serial); // 读电压值1号地址 modbus2.begin(2, Serial); // 读电压值2号地址 modbus3.begin(3, Serial); // 写电压值3 modbus4.begin(4, Serial); // 写电压值 4 modbus5.begin(5, Serial); // 写电压值 5 } void loop() { // 主循环为空,因为我们使用定时器中断进行定时 // Serial.println("..."); if (currentMillis - previousDACMillis >= DAC_UPDATE_INTERVAL) { // 更新previousDACMillis previousDACMillis = currentMillis; // Serial.println("Updating DAC..."); // 设置DAC寄存器值 // 示例代码,实际需要根据你的DAC模块寄存器映射进行修改 // uint16_t dacValues[6] = {0, 0, 0, 0, 0, 0}; // 示例的DAC值 uint16_t n=0; for (int i = 0; i < 2; i++) { // 设置第i个通道的DAC寄存器值 //uint8_t res1 = modbus3.writeSingleRegister(0x03EE + i, dacValues[n++]++); uint8_t res1; if(i==0){ res1 = modbus3.writeSingleRegister(0x03EE + i, dac1++); } if(i==1){ res1 = modbus3.writeSingleRegister(0x03EE + i, dac2++); } delay(1100); // 检查返回的状态码 if (res1 == modbus3.ku8MBSuccess) { Serial.println("writeSingleRegister 3成功!"); Serial.println(dac1,DEC); Serial.println(dac2,DEC); } else { Serial.print("writeSingleRegister 3失败,错误码为: "); Serial.println(res1, HEX); } delay(1100); // 等待一段时间,确保Modbus通信完成 } for (int i = 0; i < 2; i++) { // 设置第i个通道的DAC寄存器值 // uint8_t res1 = modbus4.writeSingleRegister(0x03EE + i, dacValues[n++]++); uint8_t res1; if(i==0){ res1 = modbus4.writeSingleRegister(0x03EE + i, dac3++); } if(i==1){ res1 = modbus4.writeSingleRegister(0x03EE + i, dac4++); } delay(1100); // 检查返回的状态码 if (res1 == modbus4.ku8MBSuccess) { Serial.println("writeSingleRegister 4成功!"); Serial.println(dac3,DEC); Serial.println(dac4,DEC); } else { Serial.print("writeSingleRegister 4失败,错误码为: "); Serial.println(res1, HEX); } delay(1100); // 等待一段时间,确保Modbus通信完成 } for (int i = 0; i < 2; i++) { // 设置第i个通道的DAC寄存器值 // uint8_t res1 = modbus5.writeSingleRegister(0x03EE + i, dacValues[n++]++); uint8_t res1; if(i==0){ res1 = modbus5.writeSingleRegister(0x03EE + i, dac5++); } if(i==1){ res1 = modbus5.writeSingleRegister(0x03EE + i, dac6++); } delay(1100); // 检查返回的状态码 if (res1 == modbus5.ku8MBSuccess) { Serial.println("writeSingleRegister 5成功!"); Serial.println(dac5,DEC); Serial.println(dac6,DEC); } else { Serial.print("writeSingleRegister 5失败,错误码为: "); Serial.println(res1, HEX); } delay(1100); // 等待一段时间,确保Modbus通信完成 } } // 检查是否到达读取ADC的时间间隔 if (currentMillis - previousADCMillis >= ADC_READ_INTERVAL) { // Serial.println("Reading ADC..."); // 读取ADC寄存器值 uint8_t result; uint16_t adcValue2; // 更新previousADCMillis previousADCMillis = currentMillis; for (int i = 0; i < 4; i++) { // 读取第i个通道的ADC寄存器值 result = modbus1.readHoldingRegisters(0x51B+i, 1); delay(1000); // 等待一段时间,确保Modbus通信完成 // 检查通信是否成功 if (result == modbus1.ku8MBSuccess) { // 获取读取到的寄存器值 adcValue2 = modbus1.getResponseBuffer(0); // 打印读取到的寄存器值 Serial.print("设备地址 1号, ADC通道 "); Serial.print(i); Serial.print(" 的的值为: "); Serial.println(adcValue2, DEC); delay(1000); } else { // 打印错误信息 Serial.print("设备地址 1号Error: "); Serial.println(result, HEX); } } delay(1000); for (int i = 0; i < 4; i++) { // 读取第i个通道的ADC寄存器值 result = modbus2.readHoldingRegisters(0x51B+i, 1); delay(1000); // 等待一段时间,确保Modbus通信完成 // 检查通信是否成功 if (result == modbus2.ku8MBSuccess) { // 获取读取到的寄存器值 adcValue2 = modbus2.getResponseBuffer(0); // 打印读取到的寄存器值 Serial.print("设备地址 2号, ADC通道 "); Serial.print(i); Serial.print(" 的值为: "); Serial.println(adcValue2, DEC); delay(1000); } else { // 打印错误信息 Serial.print("设备地址 2号Error: "); Serial.println(result, HEX); } } delay(1000); } } // 定时器1中断服务程序 void timerISR() { // 获取当前时间 currentMillis = millis(); // 检查是否到达更新DAC的时间间隔 }
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
