Помогите разобраться с модбас

Использование протокола Modbus
Ответить
mixalych
Рядовой
Сообщения: 8
Зарегистрирован: 16.08.2017{, 11:32}
Репутация: 0

Помогите разобраться с модбас

#1

Сообщение mixalych » 29.09.2017{, 20:53}

Здравствуйте. Пытаюсь разобраться с flprog и modbus. Создал простейший скетч выключатель - диод. Пытаюсь считывать состояние цифрового входа. При запуске QModBus выводит сообщение: Could not connect serial port. В Terring modbus tools при попытке чтения пишет: Timeout Error. Timeout 1000ms.
Что я пропустил? Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
Вложения
8178788.flp
(50.55 КБ) 93 скачивания

Аватара пользователя
Dev1
Майор
Сообщения: 1026
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 59
Откуда: Гондурас

Помогите разобраться с модбас

#2

Сообщение Dev1 » 29.09.2017{, 21:05}

mixalych писал(а):Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
Обязательно.
Win10-64 FLProg v7.5.2 Portable :fie:

Аватара пользователя
Dev1
Майор
Сообщения: 1026
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 59
Откуда: Гондурас

Помогите разобраться с модбас

#3

Сообщение Dev1 » 29.09.2017{, 21:11}

Поставил стандартный сом порт
Вложения
3136605.flp
(49.94 КБ) 100 скачиваний
Win10-64 FLProg v7.5.2 Portable :fie:

mixalych
Рядовой
Сообщения: 8
Зарегистрирован: 16.08.2017{, 11:32}
Репутация: 0

Помогите разобраться с модбас

#4

Сообщение mixalych » 29.09.2017{, 21:19}

То же самое. Пробовал задавать адрес и скорость порта, по образцу из этого видео https://www.youtube.com/watch?time_cont ... 60kZgquUU8. Результат тот же.
Вложения
8072403.flp
(145.17 КБ) 97 скачиваний
Последний раз редактировалось mixalych 29.09.2017{, 21:32}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Помогите разобраться с модбас

#5

Сообщение Sancho » 30.09.2017{, 08:46}

mixalych, Вам  Dev1  предложил минимальный вариант для проверки.
А Вы всё пытаетесь через soft serial, не расказав о железе между ним и программой.
Последний скетч не являетс простейшим, в отличии от поста 3.

Добавлено (30.09.2017, 08:46)
---------------------------------------------
Точно читаете один input рег ?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

mixalych
Рядовой
Сообщения: 8
Зарегистрирован: 16.08.2017{, 11:32}
Репутация: 0

Помогите разобраться с модбас

#6

Сообщение mixalych » 30.09.2017{, 09:32}

Железо: Arduino uno; uart-rs485; rs485-usb.
Загрузил скетч Dev1 прилагаю скриншоты.

Я так понимаю у меня проблемы с железом. Вроде дрова стали, ничего не ругается, а связи нет. Пробовал разные примеры с интернета, результат тот же.
Вложения
5633125.png
8339626.png
Последний раз редактировалось mixalych 30.09.2017{, 09:59}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Помогите разобраться с модбас

#7

Сообщение Sancho » 30.09.2017{, 10:29}

Самое слабое звено, подозреваю на 99%, uart-rs485, особенно из ценовой политики 30-50 руб.
Попробуйте напрямую, через Serial0, usb, подключить.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

mixalych
Рядовой
Сообщения: 8
Зарегистрирован: 16.08.2017{, 11:32}
Репутация: 0

Помогите разобраться с модбас

#8

Сообщение mixalych » 30.09.2017{, 10:37}

Наверное вы правы покупал, чтобы попробовать самые дешевые.
https://ru.aliexpress.com/item.....0bkWHp

Не совсем понял как подключить напрямую, что делать с Pe-De?

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Помогите разобраться с модбас

#9

Сообщение Sancho » 30.09.2017{, 10:42}

Можешь ничего не делать, можешь установить "нет".
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

mixalych
Рядовой
Сообщения: 8
Зарегистрирован: 16.08.2017{, 11:32}
Репутация: 0

Помогите разобраться с модбас

#10

Сообщение mixalych » 30.09.2017{, 10:55}

Спасибо. Заработало. Буду дальше учиться.

mixalych
Рядовой
Сообщения: 8
Зарегистрирован: 16.08.2017{, 11:32}
Репутация: 0

Помогите разобраться с модбас

#11

Сообщение mixalych » 30.09.2017{, 12:21}

Собрал вот такую схему:


Работает управление и с кнопки и со скады независимо, но естественно нет обратной связи. Скада не видит что включен выключатель. Попробовал вот таким образом:

Диод включается только с кнопки, команда со скады не проходит. Можно ли в регистр хранения записывать с двух мест?

Добавлено (30.09.2017, 12:21)
---------------------------------------------
Проблему понял каждый новый цикл регистр обновляется по состоянию выключателя. Как решить?
Вложения
3036257.png
2945816.png

JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 89
Откуда: Близко к Ставрополю
Имя: Евгений

Помогите разобраться с модбас

#12

Сообщение JonyBest » 06.11.2017{, 20:09}

Доброго времени суток!
Чтобы не плодить темы спрошу здесь.
Пользуюсь связкой Демо-версией Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPC
Все устраивает, но в последнее время возник дефицит бесплатных тегов Modbus.
Основной вопрос - как можно ЭКОНОМНО передать значения с нескольких датчиков? Сейчас каждое значение - новый тег. flprog позволяет передавать только числовые значения.
На ум приходит только одно решение - показания датчиков переводить в текст, текст складывать в нужной последовательности - переводить опять в число long integer - передача в Modbus - в Simple-Scada 2 переводим в текст, зная алгоритм, разбиваем по значениям - переводим в число - вывод.
Может есть решение полегче?
Последний раз редактировалось JonyBest 06.11.2017{, 20:10}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Помогите разобраться с модбас

#13

Сообщение Sancho » 07.11.2017{, 06:56}

JonyBest писал(а):Пользуюсь связкой Демо-версией Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPCВсе устраивает, но в последнее время возник дефицит бесплатных тегов Modbus........
1. Значения двух датчиков кладёшь в соседние регистры, считываешь как int32(long int), в скада одно получаешь делением на 65536, другое остаток от деления на 65536. Можно похожим образом передать и три значения, зависит от размерности исходников.
2. Овен ОРС
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 89
Откуда: Близко к Ставрополю
Имя: Евгений

Помогите разобраться с модбас

#14

Сообщение JonyBest » 07.11.2017{, 09:12}

Sancho писал(а):Значения двух датчиков кладёшь в соседние регистры, считываешь как int32(long int), в скада одно получаешь делением на 65536, другое остаток от деления на 65536. Можно похожим образом передать и три значения, зависит от размерности исходников.2. Овен ОРС
За второе отдельное спасибо! А по первому можно пример на два и три значения, не догоняю как...

KSP
Лейтенант
Сообщения: 304
Зарегистрирован: 18.09.2015{, 14:00}
Репутация: 28
Откуда: Саратов
Имя: Сергей

Помогите разобраться с модбас

#15

Сообщение KSP » 07.11.2017{, 09:37}

Я плохо знаком с Simple-Scada 2 и OPC-сервер Modbus Universal MasterOPC ,  но для сокращения числа переменных пользуюсь вот таким нехитрым приспособлением если время опроса датчиков не критично. В блоке слейва все наоборот я думаю понятно.
Вложения
8835545.flp
(100.41 КБ) 106 скачиваний
S

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Помогите разобраться с модбас

#16

Сообщение Sancho » 07.11.2017{, 10:31}

KSP писал(а):но для сокращения числа переменных пользуюсь вот таким нехитрым приспособлением
Сокращая переменные в одном месте, Вы увеличиваете их в другом, раздуваете программу счётчиком и т.д.
Время на передачу нескольких дополнительных регистров настолько мало, что им вообще можно пренебречь.
JonyBest писал(а):За второе отдельное спасибо! А по первому можно пример на два и три значения, не догоняю как...
Если разобрались с ОРС, то не забивайте себе мозг. 
Но в общих чертах на скринах -  передаю значения от ПИДов на клапана, точность 1%, входное real(float) 0-1.

Добавлено (07.11.2017, 10:31)
---------------------------------------------
Всё отлично работает. Управление уставками, моторами - скорости, режим и т.д. тоже через регистр, т.к. в контролере только Holding и нет битовой маски. Собираю в один, потом распаковываю.
 Последняя ссылка в тексте.
Вложения
7169481.png
6832172.png
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 89
Откуда: Близко к Ставрополю
Имя: Евгений

Помогите разобраться с модбас

#17

Сообщение JonyBest » 07.11.2017{, 22:40}

Спасибо огромное за направление! Попробовал. Оба варианта имеют право на жизнь.

alexcccp
Рядовой
Сообщения: 37
Зарегистрирован: 16.01.2018{, 18:53}
Репутация: 0

Помогите разобраться с модбас

#18

Сообщение alexcccp » 28.09.2018{, 17:20}

Ребят, этажа проблема
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С хотя обычно она ch340G
не знаю сильна ли разница.

короче отчаянный шаг, повесил на RX TX - USB TTL.
и о чудо QmodBus заработал.

но самое смешное Terring Modbus Tools НЕТ!

в чем может быт дело, что за ерунда

Отправлено спустя 8 минут 20 секунд:
как говорится сам дебил.
Два дня сидел из за галки в Terring Modbus Tools
Modbus/ASCII
вместо
Modbus/RTU

как она там оказалась не пойму
заработало по 485

пошел пить пятница ! всем спасибо! правда! старался писал, нашел ошибку. :smile390:

Ответить

Вернуться в «Modbus»