Помогите разобраться с модбас
Помогите разобраться с модбас
Здравствуйте. Пытаюсь разобраться с flprog и modbus. Создал простейший скетч выключатель - диод. Пытаюсь считывать состояние цифрового входа. При запуске QModBus выводит сообщение: Could not connect serial port. В Terring modbus tools при попытке чтения пишет: Timeout Error. Timeout 1000ms.
Что я пропустил? Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
Что я пропустил? Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dev1
- Майор
- Сообщения: 1045
- Зарегистрирован: 12 июл 2016, 18:04
- Откуда: Гондурас
- Поблагодарили: 3 раза
Помогите разобраться с модбас
Обязательно.mixalych писал(а):Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x 

- Dev1
- Майор
- Сообщения: 1045
- Зарегистрирован: 12 июл 2016, 18:04
- Откуда: Гондурас
- Поблагодарили: 3 раза
Помогите разобраться с модбас
Поставил стандартный сом порт
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x 

Помогите разобраться с модбас
То же самое. Пробовал задавать адрес и скорость порта, по образцу из этого видео https://www.youtube.com/watch?time_continue=470&v=v60kZgquUU8. Результат тот же.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось mixalych 29 сен 2017, 21:32, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Помогите разобраться с модбас
mixalych, Вам Dev1 предложил минимальный вариант для проверки.
А Вы всё пытаетесь через soft serial, не расказав о железе между ним и программой.
Последний скетч не являетс простейшим, в отличии от поста 3.
Добавлено (30.09.2017, 08:46)
---------------------------------------------
Точно читаете один input рег ?
А Вы всё пытаетесь через soft serial, не расказав о железе между ним и программой.
Последний скетч не являетс простейшим, в отличии от поста 3.
Добавлено (30.09.2017, 08:46)
---------------------------------------------
Точно читаете один input рег ?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Помогите разобраться с модбас
Железо: Arduino uno; uart-rs485; rs485-usb.
Загрузил скетч Dev1 прилагаю скриншоты.
Я так понимаю у меня проблемы с железом. Вроде дрова стали, ничего не ругается, а связи нет. Пробовал разные примеры с интернета, результат тот же.
Загрузил скетч Dev1 прилагаю скриншоты.
Я так понимаю у меня проблемы с железом. Вроде дрова стали, ничего не ругается, а связи нет. Пробовал разные примеры с интернета, результат тот же.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось mixalych 30 сен 2017, 09:59, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Помогите разобраться с модбас
Самое слабое звено, подозреваю на 99%, uart-rs485, особенно из ценовой политики 30-50 руб.
Попробуйте напрямую, через Serial0, usb, подключить.
Попробуйте напрямую, через Serial0, usb, подключить.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Помогите разобраться с модбас
Наверное вы правы покупал, чтобы попробовать самые дешевые.
https://ru.aliexpress.com/item.....0bkWHp
Не совсем понял как подключить напрямую, что делать с Pe-De?
https://ru.aliexpress.com/item.....0bkWHp
Не совсем понял как подключить напрямую, что делать с Pe-De?
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Помогите разобраться с модбас
Можешь ничего не делать, можешь установить "нет".
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Помогите разобраться с модбас
Собрал вот такую схему:
Работает управление и с кнопки и со скады независимо, но естественно нет обратной связи. Скада не видит что включен выключатель. Попробовал вот таким образом:
Диод включается только с кнопки, команда со скады не проходит. Можно ли в регистр хранения записывать с двух мест?
Добавлено (30.09.2017, 12:21)
---------------------------------------------
Проблему понял каждый новый цикл регистр обновляется по состоянию выключателя. Как решить?
Работает управление и с кнопки и со скады независимо, но естественно нет обратной связи. Скада не видит что включен выключатель. Попробовал вот таким образом:
Диод включается только с кнопки, команда со скады не проходит. Можно ли в регистр хранения записывать с двух мест?
Добавлено (30.09.2017, 12:21)
---------------------------------------------
Проблему понял каждый новый цикл регистр обновляется по состоянию выключателя. Как решить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Сержант
- Сообщения: 269
- Зарегистрирован: 18 ноя 2015, 22:42
- Откуда: Близко к Ставрополю
- Имя: Евгений
- Поблагодарили: 2 раза
Помогите разобраться с модбас
Доброго времени суток!
Чтобы не плодить темы спрошу здесь.
Пользуюсь связкой Демо-версией Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPC
Все устраивает, но в последнее время возник дефицит бесплатных тегов Modbus.
Основной вопрос - как можно ЭКОНОМНО передать значения с нескольких датчиков? Сейчас каждое значение - новый тег. flprog позволяет передавать только числовые значения.
На ум приходит только одно решение - показания датчиков переводить в текст, текст складывать в нужной последовательности - переводить опять в число long integer - передача в Modbus - в Simple-Scada 2 переводим в текст, зная алгоритм, разбиваем по значениям - переводим в число - вывод.
Может есть решение полегче?
Чтобы не плодить темы спрошу здесь.
Пользуюсь связкой Демо-версией Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPC
Все устраивает, но в последнее время возник дефицит бесплатных тегов Modbus.
Основной вопрос - как можно ЭКОНОМНО передать значения с нескольких датчиков? Сейчас каждое значение - новый тег. flprog позволяет передавать только числовые значения.
На ум приходит только одно решение - показания датчиков переводить в текст, текст складывать в нужной последовательности - переводить опять в число long integer - передача в Modbus - в Simple-Scada 2 переводим в текст, зная алгоритм, разбиваем по значениям - переводим в число - вывод.
Может есть решение полегче?
Последний раз редактировалось JonyBest 06 ноя 2017, 20:10, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Помогите разобраться с модбас
1. Значения двух датчиков кладёшь в соседние регистры, считываешь как int32(long int), в скада одно получаешь делением на 65536, другое остаток от деления на 65536. Можно похожим образом передать и три значения, зависит от размерности исходников.JonyBest писал(а):Пользуюсь связкой Демо-версией Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPCВсе устраивает, но в последнее время возник дефицит бесплатных тегов Modbus........
2. Овен ОРС
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Сержант
- Сообщения: 269
- Зарегистрирован: 18 ноя 2015, 22:42
- Откуда: Близко к Ставрополю
- Имя: Евгений
- Поблагодарили: 2 раза
Помогите разобраться с модбас
За второе отдельное спасибо! А по первому можно пример на два и три значения, не догоняю как...Sancho писал(а):Значения двух датчиков кладёшь в соседние регистры, считываешь как int32(long int), в скада одно получаешь делением на 65536, другое остаток от деления на 65536. Можно похожим образом передать и три значения, зависит от размерности исходников.2. Овен ОРС
-
- Лейтенант
- Сообщения: 305
- Зарегистрирован: 18 сен 2015, 14:00
- Откуда: Саратов
- Имя: Сергей
- Поблагодарили: 1 раз
Помогите разобраться с модбас
Я плохо знаком с Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPC , но для сокращения числа переменных пользуюсь вот таким нехитрым приспособлением если время опроса датчиков не критично. В блоке слейва все наоборот я думаю понятно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
S
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Помогите разобраться с модбас
Сокращая переменные в одном месте, Вы увеличиваете их в другом, раздуваете программу счётчиком и т.д.KSP писал(а):но для сокращения числа переменных пользуюсь вот таким нехитрым приспособлением
Время на передачу нескольких дополнительных регистров настолько мало, что им вообще можно пренебречь.
Если разобрались с ОРС, то не забивайте себе мозг.JonyBest писал(а):За второе отдельное спасибо! А по первому можно пример на два и три значения, не догоняю как...
Но в общих чертах на скринах - передаю значения от ПИДов на клапана, точность 1%, входное real(float) 0-1.
Добавлено (07.11.2017, 10:31)
---------------------------------------------
Всё отлично работает. Управление уставками, моторами - скорости, режим и т.д. тоже через регистр, т.к. в контролере только Holding и нет битовой маски. Собираю в один, потом распаковываю.
Последняя ссылка в тексте.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Сержант
- Сообщения: 269
- Зарегистрирован: 18 ноя 2015, 22:42
- Откуда: Близко к Ставрополю
- Имя: Евгений
- Поблагодарили: 2 раза
Помогите разобраться с модбас
Спасибо огромное за направление! Попробовал. Оба варианта имеют право на жизнь.
Помогите разобраться с модбас
Ребят, этажа проблема
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
Отправлено спустя 1 час 13 минут 20 секунд:
засада два
есть софт
Terring Modbus Tools, а также QmodBus
Terring Modbus Tools который до этого у меня прекрасно работал по 485, работать не хочет.
QmodBus - сходу орет на порт несмотря на то то драйвер работает корректно
микросхема в моем китайском ариаднино стоит ch340С хотя обычно она ch340G
не знаю сильна ли разница.
короче отчаянный шаг, повесил на RX TX - USB TTL.
и о чудо QmodBus заработал.
но самое смешное Terring Modbus Tools НЕТ!
в чем может быт дело, что за ерунда
Отправлено спустя 8 минут 20 секунд:
как говорится сам дебил.
Два дня сидел из за галки в Terring Modbus Tools
Modbus/ASCII
вместо
Modbus/RTU
как она там оказалась не пойму
заработало по 485
пошел пить пятница ! всем спасибо! правда! старался писал, нашел ошибку.
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;
}
засада два
есть софт
Terring Modbus Tools, а также QmodBus
Terring Modbus Tools который до этого у меня прекрасно работал по 485, работать не хочет.
QmodBus - сходу орет на порт несмотря на то то драйвер работает корректно
микросхема в моем китайском ариаднино стоит ch340С хотя обычно она ch340G
не знаю сильна ли разница.
короче отчаянный шаг, повесил на RX TX - USB TTL.
и о чудо QmodBus заработал.
но самое смешное Terring Modbus Tools НЕТ!
в чем может быт дело, что за ерунда
Отправлено спустя 8 минут 20 секунд:
как говорится сам дебил.
Два дня сидел из за галки в Terring Modbus Tools
Modbus/ASCII
вместо
Modbus/RTU
как она там оказалась не пойму
заработало по 485
пошел пить пятница ! всем спасибо! правда! старался писал, нашел ошибку.

Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя