Страница 1 из 1
Помогите разобраться с модбас
Добавлено: 29.09.2017{, 20:53}
mixalych
Здравствуйте. Пытаюсь разобраться с flprog и modbus. Создал простейший скетч выключатель - диод. Пытаюсь считывать состояние цифрового входа. При запуске QModBus выводит сообщение: Could not connect serial port. В Terring modbus tools при попытке чтения пишет: Timeout Error. Timeout 1000ms.
Что я пропустил? Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
Помогите разобраться с модбас
Добавлено: 29.09.2017{, 21:05}
Dev1
mixalych писал(а):Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
Обязательно.
Помогите разобраться с модбас
Добавлено: 29.09.2017{, 21:11}
Dev1
Поставил стандартный сом порт
Помогите разобраться с модбас
Добавлено: 29.09.2017{, 21:19}
mixalych
То же самое. Пробовал задавать адрес и скорость порта, по образцу из этого видео
https://www.youtube.com/watch?time_cont ... 60kZgquUU8. Результат тот же.
Помогите разобраться с модбас
Добавлено: 30.09.2017{, 08:46}
Sancho
mixalych, Вам Dev1 предложил минимальный вариант для проверки.
А Вы всё пытаетесь через soft serial, не расказав о железе между ним и программой.
Последний скетч не являетс простейшим, в отличии от поста 3.
Добавлено (30.09.2017, 08:46)
---------------------------------------------
Точно читаете один input рег ?
Помогите разобраться с модбас
Добавлено: 30.09.2017{, 09:32}
mixalych
Железо: Arduino uno; uart-rs485; rs485-usb.
Загрузил скетч Dev1 прилагаю скриншоты.
Я так понимаю у меня проблемы с железом. Вроде дрова стали, ничего не ругается, а связи нет. Пробовал разные примеры с интернета, результат тот же.
Помогите разобраться с модбас
Добавлено: 30.09.2017{, 10:29}
Sancho
Самое слабое звено, подозреваю на 99%, uart-rs485, особенно из ценовой политики 30-50 руб.
Попробуйте напрямую, через Serial0, usb, подключить.
Помогите разобраться с модбас
Добавлено: 30.09.2017{, 10:37}
mixalych
Наверное вы правы покупал, чтобы попробовать самые дешевые.
https://ru.aliexpress.com/item.....0bkWHp
Не совсем понял как подключить напрямую, что делать с Pe-De?
Помогите разобраться с модбас
Добавлено: 30.09.2017{, 10:42}
Sancho
Можешь ничего не делать, можешь установить "нет".
Помогите разобраться с модбас
Добавлено: 30.09.2017{, 10:55}
mixalych
Спасибо. Заработало. Буду дальше учиться.
Помогите разобраться с модбас
Добавлено: 30.09.2017{, 12:21}
mixalych
Собрал вот такую схему:
Работает управление и с кнопки и со скады независимо, но естественно нет обратной связи. Скада не видит что включен выключатель. Попробовал вот таким образом:
Диод включается только с кнопки, команда со скады не проходит. Можно ли в регистр хранения записывать с двух мест?
Добавлено (30.09.2017, 12:21)
---------------------------------------------
Проблему понял каждый новый цикл регистр обновляется по состоянию выключателя. Как решить?
Помогите разобраться с модбас
Добавлено: 06.11.2017{, 20:09}
JonyBest
Доброго времени суток!
Чтобы не плодить темы спрошу здесь.
Пользуюсь связкой Демо-версией Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPC
Все устраивает, но в последнее время возник дефицит бесплатных тегов Modbus.
Основной вопрос - как можно ЭКОНОМНО передать значения с нескольких датчиков? Сейчас каждое значение - новый тег. flprog позволяет передавать только числовые значения.
На ум приходит только одно решение - показания датчиков переводить в текст, текст складывать в нужной последовательности - переводить опять в число long integer - передача в Modbus - в Simple-Scada 2 переводим в текст, зная алгоритм, разбиваем по значениям - переводим в число - вывод.
Может есть решение полегче?
Помогите разобраться с модбас
Добавлено: 07.11.2017{, 06:56}
Sancho
JonyBest писал(а):Пользуюсь связкой Демо-версией Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPCВсе устраивает, но в последнее время возник дефицит бесплатных тегов Modbus........
1. Значения двух датчиков кладёшь в соседние регистры, считываешь как int32(long int), в скада одно получаешь делением на 65536, другое остаток от деления на 65536. Можно похожим образом передать и три значения, зависит от размерности исходников.
2.
Овен ОРС
Помогите разобраться с модбас
Добавлено: 07.11.2017{, 09:12}
JonyBest
Sancho писал(а):Значения двух датчиков кладёшь в соседние регистры, считываешь как int32(long int), в скада одно получаешь делением на 65536, другое остаток от деления на 65536. Можно похожим образом передать и три значения, зависит от размерности исходников.2. Овен ОРС
За второе отдельное спасибо! А по первому можно пример на два и три значения, не догоняю как...
Помогите разобраться с модбас
Добавлено: 07.11.2017{, 09:37}
KSP
Я плохо знаком с Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPC , но для сокращения числа переменных пользуюсь вот таким нехитрым приспособлением если время опроса датчиков не критично. В блоке слейва все наоборот я думаю понятно.
Помогите разобраться с модбас
Добавлено: 07.11.2017{, 10:31}
Sancho
KSP писал(а):но для сокращения числа переменных пользуюсь вот таким нехитрым приспособлением
Сокращая переменные в одном месте, Вы увеличиваете их в другом, раздуваете программу счётчиком и т.д.
Время на передачу нескольких дополнительных регистров настолько мало, что им вообще можно пренебречь.
JonyBest писал(а):За второе отдельное спасибо! А по первому можно пример на два и три значения, не догоняю как...
Если разобрались с ОРС, то не забивайте себе мозг.
Но в общих чертах на скринах - передаю значения от ПИДов на клапана, точность 1%, входное real(float) 0-1.
Добавлено (07.11.2017, 10:31)
---------------------------------------------
Всё отлично работает. Управление уставками, моторами - скорости, режим и т.д. тоже через регистр, т.к. в контролере только Holding и нет битовой маски. Собираю в один, потом распаковываю.
Последняя ссылка в тексте.
Помогите разобраться с модбас
Добавлено: 07.11.2017{, 22:40}
JonyBest
Спасибо огромное за направление! Попробовал. Оба варианта имеют право на жизнь.
Помогите разобраться с модбас
Добавлено: 28.09.2018{, 17:20}
alexcccp
Ребят, этажа проблема
Timeout 1000ms.
Железо Nano 328 + uart-485 - 485-USB
Причем сначало все хорошо работало
(с ошибками связи но темнимение)
потом бац и перестало
побывал вариант
Dev1 на собственном порту arduino
также нет связи тишина
я что то не пойму
До этого обновлял FLprog c 3.0.3 до 4
С 4 была проблема с запуском среды ардуино. вернулся на 3.0.3
Все хвосты вычистил
два бессонных дня, уже ничего не понимаю
RX-мигает TX-молчит как партизан
скеч который создает FLprog 3.0.3 проект
Dev1
Код: Выделить всё
bool _modbusSlaveDataTable_1[1];
int _modbusSlaveAddresTable_1[1] = {0};
byte _modbusSlaveBufferSize = 0;
byte _modbusSlaveLastRec = 0;
long _modbusSlaveTime;
byte _modbusSlaveBuffer[64];
const unsigned char _modbusSlave_fctsupported[] = {2};
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
pinMode(10, INPUT);
digitalWrite(10, HIGH);
pinMode(11, OUTPUT);
}
void loop()
{_modbusSlavePoll();
//Плата:1
digitalWrite(11, !( (digitalRead (10))));
_modbusSlaveDataTable_1[0] = !( (digitalRead (10)));
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
int modbusCalcCRC(byte length, byte bufferArray[])
{
unsigned int temp, temp2, flag;
temp = 0xFFFF;
for (unsigned char i = 0; i < length; i++) {
temp = temp ^ bufferArray[i];
for (unsigned char j = 1; j <= 8; j++) {
flag = temp & 0x0001;
temp >>= 1;
if (flag) temp ^= 0xA001;
}
}
temp2 = temp >> 8;
temp = (temp << 8) | temp2;
temp &= 0xFFFF;
return temp;
}
byte _modbusSlavePoll()
{
byte avalibleBytes = Serial.available();
if (avalibleBytes == 0) return 0;
if (avalibleBytes != _modbusSlaveLastRec) {
_modbusSlaveLastRec = avalibleBytes;
_modbusSlaveTime = millis();
return 0;
}
if (!(_isTimer(_modbusSlaveTime, 5))) return 0;
_modbusSlaveLastRec = 0;
byte state = _modbusGetSlaveRxBuffer();
if (state < 7) {
return state;
}
if ((_modbusSlaveBuffer[0] != 1) && (_modbusSlaveBuffer[0] != 0)) return 0;
byte exception = _modbusValidateRequest();
if (exception > 0) {
if (exception != 255) { _modbusSlaveBuildException( exception );
_modbusSlaveSendTxBuffer();
}
return exception;
}
switch ( _modbusSlaveBuffer[1] ) {
case 2 :
return process_modbus_FC1(1);
break;
default:
break;
}
return 25;
}
byte _modbusValidateRequest() {
int msgCRC =
((_modbusSlaveBuffer[_modbusSlaveBufferSize - 2] << 8)
| _modbusSlaveBuffer[_modbusSlaveBufferSize - 1]);
if ( modbusCalcCRC( _modbusSlaveBufferSize - 2, _modbusSlaveBuffer ) != msgCRC ) { return 255;}
boolean isSupported = false;
for (uint8_t i = 0; i < sizeof( _modbusSlave_fctsupported ); i++) {
if (_modbusSlave_fctsupported[i] == _modbusSlaveBuffer[1]) {
isSupported = 1;
break;
}
}
if (!isSupported) { return 1;}
int intRegs = 0;
byte byteRegs;
switch ( _modbusSlaveBuffer[1] ) {
case 2 :
if(!(checkModbusRange(word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3]) , word( _modbusSlaveBuffer[4], _modbusSlaveBuffer[5]),1))){return 2;}
break;
}
return 0; // OK, no exception code thrown
}
bool checkModbusAddres(int addr, byte table)
{
return (!(( modbusSlaveIndexForAddres(addr,table)) == -1));
}
int modbusSlaveIndexForAddres(int addr, byte table)
{
int tableSize = 0;
switch (table) {
case 1:
tableSize = 1;
break;
}
for (byte i = 0; i < tableSize; i++) {if((modbusSlaveAddresFromIndex(i,table)) == addr){return i;}}
return -1;
}
int modbusSlaveAddresFromIndex(byte index, byte table)
{
switch (table) {
case 1:
return _modbusSlaveAddresTable_1[index];
break;
}
return -1;
}
bool checkModbusRange(int startAddr, int addrNumber, byte table)
{
for (int i=0; i < addrNumber; i++) {if(!(checkModbusAddres((startAddr+i),table))){return false;}}
return true;
}
void _modbusSlaveBuildException( byte exception ) {
byte func = _modbusSlaveBuffer[1];
_modbusSlaveBuffer[0] = 1;
_modbusSlaveBuffer[1] = func + 0x80;
_modbusSlaveBuffer[ 2 ] = exception;
_modbusSlaveBufferSize = 3;}
void _modbusSlaveSendTxBuffer()
{
if(_modbusSlaveBuffer[0] == 0) {return;}
byte i = 0;
int crc = modbusCalcCRC( _modbusSlaveBufferSize,_modbusSlaveBuffer );
_modbusSlaveBuffer[ _modbusSlaveBufferSize ] = crc >> 8;
_modbusSlaveBufferSize++;
_modbusSlaveBuffer[ _modbusSlaveBufferSize ] = crc & 0x00ff;
_modbusSlaveBufferSize++;
UCSR0A=UCSR0A |(1 << TXC0);
digitalWrite(13, HIGH );
delay (5);
Serial.write( _modbusSlaveBuffer, _modbusSlaveBufferSize );
while (!(UCSR0A & (1 << TXC0)));
delay (5);
digitalWrite(13, LOW );
Serial.flush();
_modbusSlaveBufferSize = 0;
}
byte _modbusGetSlaveRxBuffer()
{
boolean bBuffOverflow = false;
digitalWrite(13, LOW );
_modbusSlaveBufferSize = 0;
while (Serial.available() ) {
_modbusSlaveBuffer[ _modbusSlaveBufferSize ] = Serial.read();
_modbusSlaveBufferSize ++;
if (_modbusSlaveBufferSize >= 64) bBuffOverflow = true;
}
if (bBuffOverflow) {return -3; }
return _modbusSlaveBufferSize;
}
byte process_modbus_FC1(byte table)
{
byte bytesNo, bitsNo;
int currentCoil, coil;
bool value;
byte index;
int startCoil = word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[ 3] );
int coilNo = word( _modbusSlaveBuffer[4], _modbusSlaveBuffer[5] );
bytesNo = byte(coilNo / 8);
if (coilNo % 8 != 0) bytesNo ++;
_modbusSlaveBuffer[2] = bytesNo;
_modbusSlaveBufferSize = 3;
bitsNo = 0;
for (currentCoil = 0; currentCoil < coilNo; currentCoil++) {
coil = startCoil + currentCoil;
index = modbusSlaveIndexForAddres(coil, table);
if (table == 1) {value = _modbusSlaveDataTable_1[index]; }
bitWrite(
_modbusSlaveBuffer[ _modbusSlaveBufferSize ],
bitsNo,
value);
bitsNo ++;
if (bitsNo > 7) {
bitsNo = 0;
_modbusSlaveBufferSize++;
}
}
if (coilNo % 8 != 0) _modbusSlaveBufferSize ++;
_modbusSlaveSendTxBuffer();
return _modbusSlaveBufferSize + 2;
}
Отправлено спустя 1 час 13 минут 20 секунд:
засада два
есть софт
Terring Modbus Tools, а также QmodBus
Terring Modbus Tools который до этого у меня прекрасно работал по 485, работать не хочет.
QmodBus - сходу орет на порт несмотря на то то драйвер работает корректно
микросхема в моем китайском ариаднино стоит ch340
С хотя обычно она ch340
G
не знаю сильна ли разница.
короче отчаянный шаг, повесил на RX TX - USB TTL.
и о чудо QmodBus заработал.
но самое смешное Terring Modbus Tools НЕТ!
в чем может быт дело, что за ерунда
Отправлено спустя 8 минут 20 секунд:
как говорится сам дебил.
Два дня сидел из за галки в Terring Modbus Tools
Modbus/ASCII
вместо
Modbus/RTU
как она там оказалась не пойму
заработало по 485
пошел пить пятница ! всем спасибо! правда! старался писал, нашел ошибку.