Modbus и два сериал порта
- Войдите на сайт для отправки комментариев
Втр, 20/08/2019 - 04:46
Написал короткую программульку по работе нескольких устройств через RS485. При отладке, по отдельности, все работает хорошо, а в общем - нет. Не хотят работать 54 и 68 строки вместе. Любую из них отключаю, и все работает, как надо, а вместе - не хотят. Хотя бы направление - в какую сторону думать, чтобы побороть сие несовместимоть.
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 5);
//**************************************************************
uint8_t RegWrite(int adress, uint16_t StartReg, uint8_t qty, float fl)
{
if(qty == 2){
Conv.f = fl;
node.setTransmitBuffer(0x0,Conv.u[1]);
node.setTransmitBuffer(0x1,Conv.u[0]);
}
else {
node.setTransmitBuffer(0x0,fl);
node.setTransmitBuffer(0x1,0);
}
node.SlaveAddr(adress);
transmiss ();
float err=node.writeMultipleRegisters(StartReg,qty);
delay(200);
Serial.print("Error "); Serial.println(err);
node.clearTransmitBuffer();
return (err);
}
//**************************************************************
float RegRead( int adress, uint16_t StartReg, uint8_t qty)
{
node.SlaveAddr(adress);
transmiss();
node.clearTransmitBuffer();
uint8_t buf = node.readInputRegisters(StartReg, qty);
delay(200);
if(qty == 2){
Conv.u[1] = node.getResponseBuffer(1);
Conv.u[0] = node.getResponseBuffer(0);
}
else {
Conv.f = node.getResponseBuffer(0);
}
Serial.print("Adres: "); Serial.print(StartReg,HEX);
Serial.print(" =|= Value: "); Serial.println(Conv.f);
return (Conv.f);
}
//**************************************************************
void loop()
{
while (Serial.available() > 0) {
inChar = Serial.read();
delay(4);
if(isDigit(inChar) || isPunct(inChar)) val += (char)inChar;
if(isAlpha(inChar) ) comand = (char)inChar;
if(isPunct(inChar)) inString += (char)inChar;
if (inChar == '\n' && comand == "a" && val.toInt() < 8) {
RegWrite(addrs[Status], regis[Status], qty[Status], val.toFloat());
comand = val = inString = "";
}}
addr++; if(addr > 9)addr = 1;
// Read function 4
datas = RegRead(addrs[addr], regis[addr], qty[addr]);
// function 10
if(result =! 0) RegWrite(addrs[cmi], regis[cmi], qty[cmi], datas);
}
Что значит вместе не хотят работать? Не принимает одна из них, или зависает МК?
Не зависает, но перестает читать из Serial порта, шлет в него обрывки фраз, а софтовый порт перестает совсем работать (молчит как рыба в воде).
У меня есть предположения, но я честно говоря не понимаю о чем вы.Что делает функция RegRead и regWrite, почему в представленном коде создаётся объект softwareSerial но не используется ни где)
Извините упустил.Я не всю программу предоставил, а только те функции которые глючат.
Зачем форум не нужным засорять.
RegRead читает регистр на внешним устройстве по пртоколу Modbus RTU
regWrite пишет в регистр внешнего устройства по пртоколу Modbus RTU.
По Вашим незасоряющим кускам нельзя ничего сказать. Уже 5 сообщений, а до сих пор не ясно как всё взаимодействует. Приведите программу полностью, что бы можно было загрузить в МС и посмотреть что и как.
это тоже не вся программа но это то на чем я пытаюсь вылечить данный баг.
Фаил Main.ino
#include <ModbusMaster.h> #include <SoftwareSerial.h> #include "function.h" //Схема: // * RX - RO - цифровой вывод 10(соединить с TX другого устройства) // * TX - DI - цифровой вывод 11(cоединить с RX другого устройства) SoftwareSerial mySerial(2, 5); // сми2 вкл/выкл Т.реак Т.колн Уров uint8_t addrs[] = {100,8,8,8,8,8,8,8,8,8}; uint8_t qty[] = {2,2,2,2,2,2,2,1,1,1}; uint16_t regis[] = {27,0xA000,0xA002,0xA004,0xA006,0xA008, 0xA00A,0xA00B,0xA00C,0xa400}; uint8_t ID = 1; String comand = "c", val, inString; char inChar; const byte Status = 9, cmi = 0; bool flag; void setup() { pinMode(MAX485_RE_NEG, OUTPUT); pinMode(MAX485_DE, OUTPUT); // Init in receive mode digitalWrite(MAX485_RE_NEG, 0); digitalWrite(MAX485_DE, 0); // Modbus communication runs at 9600 baud Serial.begin(9600); mySerial.begin(9600); // Modbus slave ID 1 node.begin(16, mySerial); transmiss(); } void loop() { while (Serial.available() > 0) { inChar = Serial.read(); delay(200); if(isDigit(inChar) || isPunct(inChar))val += (char)inChar; if(isAlpha(inChar)) comand = (char)inChar; if(isPunct(inChar)) inString += (char)inChar; if (inChar == '\n' && comand == "a" && val.toInt() < 8) { RegWrite(addrs[Status], regis[Status], qty[Status], val.toFloat()); comand = val = inString = ""; }} ID++; if(ID > 9)ID = 1; // Read function 4 datas = RegRead(addrs[ID], regis[ID], qty[ID]); // function 10 if(result =! 0) RegWrite(addrs[cmi], regis[cmi], qty[cmi], datas); }файл function.h
#define MAX485_DE 3 #define MAX485_RE_NEG 4 void preTransmission(){ digitalWrite(MAX485_RE_NEG, 1); digitalWrite(MAX485_DE, 1);} void postTransmission(){ digitalWrite(MAX485_RE_NEG, 0); digitalWrite(MAX485_DE, 0);} //************************************************************** //Для конвертации union { uint16_t u[2]; float f; }Conv; //************************************************************** // instantiate ModbusMaster object ModbusMaster node; uint8_t result; uint16_t data[6]; float datas; //************************************************************** void transmiss (void) { // Callbacks allow us to configure the RS485 transceiver correctly node.preTransmission(preTransmission); node.postTransmission(postTransmission); } //************************************************************** uint8_t RegWrite(int adress, uint16_t StartReg, uint8_t qty, float fl) { if(qty == 2){ Conv.f = fl; node.setTransmitBuffer(0x0,Conv.u[1]); node.setTransmitBuffer(0x1,Conv.u[0]); } else { node.setTransmitBuffer(0x0,fl); node.setTransmitBuffer(0x1,0); } node.SlaveAddr(adress); transmiss (); float err=node.writeMultipleRegisters(StartReg,qty); delay(200); Serial.print("Error "); Serial.println(err); node.clearTransmitBuffer(); return (err); } //************************************************************** float RegRead( int adress, uint16_t StartReg, uint8_t qty) { node.SlaveAddr(adress); transmiss(); node.clearTransmitBuffer(); uint8_t buf = node.readInputRegisters(StartReg, qty); delay(200); if(qty == 2){ Conv.u[1] = node.getResponseBuffer(1); Conv.u[0] = node.getResponseBuffer(0); } else { Conv.f = node.getResponseBuffer(0); } Serial.print("Adres: "); Serial.print(StartReg,HEX); Serial.print(" =|= Value: "); Serial.println(Conv.f); return (Conv.f); } //**************************************************************Выдрал из основной проги и пытаюсь на этом баг победить. Не уживаются в даном случае строка 40 и 55.
По моим кускам было в полне понятно что я рабораюю с двумя портами и что они гдето глючат между собой и если у вас небыло такого глюка и вы не знаете ( я не знаю потому и спрашиваю) всю подноготню работы двух портов то наврятли и поможете. А тот кто знает ему и первого топика будет достаточно.
Я с модбас не работал, поэтому пас.
На Modbus не смотрите там все правильно приходит и уходит. Глюк в связки двух портов а как они пересекаться могут не пойму.
А у вас какой контроллер?
нано 168