Помогите разобраться с модбас
Помогите разобраться с модбас
Здравствуйте. Пытаюсь разобраться с flprog и modbus. Создал простейший скетч выключатель - диод. Пытаюсь считывать состояние цифрового входа. При запуске QModBus выводит сообщение: Could not connect serial port. В Terring modbus tools при попытке чтения пишет: Timeout Error. Timeout 1000ms.
Что я пропустил? Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
			
			
						Что я пропустил? Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
			
						- Dev1
- Майор
- Сообщения: 1052
- Зарегистрирован: 12 июл 2016, 18:04
- Откуда: Гондурас
- Поблагодарили: 11 раз
Помогите разобраться с модбас
Обязательно.mixalych писал(а):Автор в обучающих видео задает адрес и скорость порта надо ли это делать в версии 2.5.1?
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x  
			
						
- Dev1
- Майор
- Сообщения: 1052
- Зарегистрирован: 12 июл 2016, 18:04
- Откуда: Гондурас
- Поблагодарили: 11 раз
Помогите разобраться с модбас
Поставил стандартный сом порт
			
			
						У вас нет необходимых прав для просмотра вложений в этом сообщении.
			
						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)
---------------------------------------------
Проблему понял каждый новый цикл регистр обновляется по состоянию выключателя. Как решить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
			
						- 
				JonyBest
- Сержант
- Сообщения: 269
- Зарегистрирован: 18 ноя 2015, 22:42
- Откуда: Близко к Ставрополю
- Имя: Евгений
- Поблагодарили: 3 раза
Помогите разобраться с модбас
Доброго времени суток!
Чтобы не плодить темы спрошу здесь.
Пользуюсь связкой Демо-версией 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, если что. запомните на всякий. многие знают номер тлф.
			
						- 
				JonyBest
- Сержант
- Сообщения: 269
- Зарегистрирован: 18 ноя 2015, 22:42
- Откуда: Близко к Ставрополю
- Имя: Евгений
- Поблагодарили: 3 раза
Помогите разобраться с модбас
За второе отдельное спасибо! А по первому можно пример на два и три значения, не догоняю как...Sancho писал(а):Значения двух датчиков кладёшь в соседние регистры, считываешь как int32(long int), в скада одно получаешь делением на 65536, другое остаток от деления на 65536. Можно похожим образом передать и три значения, зависит от размерности исходников.2. Овен ОРС
- 
				KSP
- Лейтенант
- Сообщения: 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, если что. запомните на всякий. многие знают номер тлф.
			
						- 
				JonyBest
- Сержант
- Сообщения: 269
- Зарегистрирован: 18 ноя 2015, 22:42
- Откуда: Близко к Ставрополю
- Имя: Евгений
- Поблагодарили: 3 раза
Помогите разобраться с модбас
Спасибо огромное за направление! Попробовал. Оба варианта имеют право на жизнь.
			
			
									
						Помогите разобраться с модбас
Ребят, этажа проблема 
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
пошел пить пятница ! всем спасибо! правда! старался писал, нашел ошибку.

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

