ModBus

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Поставил первый вариант, но там почему-то справку (chm-файл) невозможно вообще посмотреть, дерево отображается, а вместо документов пустое белое поле :shok: где найти справку к ней?
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Во, оказывается файл cправки работает только тот, что в папке 71, а из остальных - нет, хотя размер и дата у них те же... (правда хеш не смотрел).
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Что-то не работает через эту биб-ку. Сделал простую прогу для чтения первого Модбас-регистра ПЛК. TCP соединение открывается нормально (айпи и порт ПЛК указаны верно), но считать значение не может, выдаёт ошибку. Судя по сообщению, вроде как превышен таймаут (150 мс), ставил его и больше, бесполезно. Вообще сам ПЛК отвечает за единицы мс, если всё нормально... Ещё не понятно, где в этой биб-ке задать slave-адрес Модбас опрашиваемого устройства (у ПЛК он равен 1). Юзаю :labview: 2012 Pro.

Изображение

Сам :vi: прикладываю.
Вложения
Модбас.vi
(14.07 КБ) 227 скачиваний
Race conditions - опасный и скользкий баг!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: ModBus

Сообщение Borjomy_1 »

Модбас Адрес ПЛК указывается в "MBAP Header/Unit ID" MB Ethernet Master Query Write Multiple Registers (poly).vi и прочих
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Судя по той бурде, что написана в справке про этот вход, даже и не поймёшь (например, "This is additional information not usually required for a MODBUS transaction"):

Код: Выделить всё

MBAP Header is a cluster containing the transaction ID and Unit ID. This is additional information not usually required for a MODBUS transaction.

Transaction Identifier—This identifier is for transaction pairing; the MODBUS server copies the request transaction identifier in the response.

Unit Identifier—This field is for intra-system routing purposes. It typically communicates to a MODBUS serial line slave through a gateway between an Ethernet TCP-IP network and a MODBUS serial line. The MODBUS client sets this field in the request, and the server response must return this field with the same value.
Последний раз редактировалось Boris_K 26 фев 2015, 16:09, всего редактировалось 1 раз.
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Спасибо, поставил там 1 в Unit ID и всё отлично заработало! :super: А вообще, корректно ли составлена моя прога для связи, правильно ли обслуживается соединение, в данном простейшем случае?
Race conditions - опасный и скользкий баг!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: ModBus

Сообщение Borjomy_1 »

Правильнее, наверное, пытаться поддерживать соединение. Это один из моих тестовых :vi: . Вам нужно только вместо чтения TCP вставить чтение Modbus.
Вложения
Тест TCP.png
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Кстати, попробовал повыдёргивать сетевой кабель из ПЛК и отключать ПЛК - после повторного включения связь всегда восстанавливалась. Когда она может порваться окончательно?
Race conditions - опасный и скользкий баг!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: ModBus

Сообщение Borjomy_1 »

если кабель оторвать и ПЛК пере-включить, то соединение будет потеряно
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

и это единственный случай?
Race conditions - опасный и скользкий баг!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: ModBus

Сообщение Borjomy_1 »

Обычно ПЛК поддерживает только одно соединение с одного IP адреса. Поэтому при попытке одновременной работы с ПЛК на рабочей станции и через программу и через, например, OPC, будут обрывы. Скорее всего с ошибкой 66. Может, 62. Также может потребоваться использовать одно соединение и на чтение и на запись, и контроль либо семафорами, либо работа явно последовательно. в одном цикле. Вообще сетевых ошибок десятка два (Забиваете в Expline Error коды с ~40 по 100 и смотрите, какие из них относятся к сети). Правильнее было-бы их как-то обрабатывать. Какие-то лечатся пересоединением, какие-то нет. Какие-то вообще малореальные.
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Как отключить само окно с ошибкой (оно появляется, если до нажатия на кнопку Stop связь находилась в состоянии ошибки), которое появляется уже после нажатия? Почему оно вообще появляется, у меня ведь в программе после выхода из цикла - только закрытие TCP-соединения, и никакого сигнализатора ошибок и т. п. нет...
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: ModBus

Сообщение Boris_K »

Кстати, попробовал повыдёргивать сетевой кабель из ПЛК и отключать ПЛК - после повторного включения связь всегда восстанавливалась
Оказалось, всё-таки она не всегда восстанавливается, причём независимо соотношения длительности отключения и таймаута, указанного при открытии ТСР-соединения.
Race conditions - опасный и скользкий баг!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: ModBus

Сообщение Borjomy_1 »

Диалог с ошибкой выскакивает тогда, когда у последнего VI, на котором она появляется, вывод ошибки никуда не подключен.
AlexNester
interested
interested
Сообщения: 5
Зарегистрирован: 30 мар 2015, 21:33
Версия LabVIEW: 09
Контактная информация:

Re: ModBus

Сообщение AlexNester »

доброго времени суток

возникла такая задача: соединить контроллер arduino duo i :labview: , причем мастер сам контроллер, а :labview: в качестве slave,
схема такая: контроллер подключен к ПК (usb), контроллер посылает сигнал через RS-485/usb конвертер (конвертер определен как com port)

режим MODBUS RTU, все работает и данные передаются нормально проверено на программе ModBus slave(mosbustools), но нужно подключить
к :labview: . Пробовал библиотечные примеры (MB Serial Example Slave.vi) связь не устанавливается, Slave не отвечает
грешу на конвертер, возможна причина в нем
кто сталкивался?

задача запись в Holding registers

Вот фрагменты кода Мастера

Код: Выделить всё

//_____________________________________MODBUS____________________________________________ 
int led = 13;   // select the pin for the LED
int q;
char bufferArray[5]; 

//////////////////// Port information ///////////////////
#define baud 19200
#define timeout 1000
#define polling 50 // the scan rate (default - 200)

// If the packets internal retry register matches
// the set retry count then communication is stopped
// on that packet. To re-enable the packet you must
// set the "connection" variable to true.
#define retry_count 5

// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 2 

#define LED 13

// This is the easiest way to create new packets
// Add as many as you want. TOTAL_NO_OF_PACKETS
// is automatically updated.
enum
{
  PACKET1,
  PACKET2,
  PACKET3,
  PACKET4,
  
  TOTAL_NO_OF_PACKETS // leave this last entry
};

// Create an array of Packets to be configured
Packet packets[TOTAL_NO_OF_PACKETS];

// Create a packetPointer to access each packet
// individually. This is not required you can access
// the array explicitly. E.g. packets[PACKET1].id = 2;
// This does become tedious though...
packetPointer packet1 = &packets[PACKET1];
packetPointer packet2 = &packets[PACKET2];
packetPointer packet3 = &packets[PACKET3];
packetPointer packet4 = &packets[PACKET4];

// Data read from the arduino slave will be stored in this array
// if the array is initialized to the packet.
unsigned int readRegs[1];

// Data to be written to the arduino slave
unsigned int writeRegs1[1];
unsigned int writeRegs2[1];
unsigned int writeRegs3[1];
unsigned int writeRegs4[1];
//________________________________________________________________________________________ 

//_____________________________________MODBUS____________________________________________      
  // The modbus packet constructor function will initialize
  // the individual packet with the assigned parameters. You can always do this
  // explicitly by using struct pointers. The first parameter is the address of the
  // packet in question. It is effectively the "this" parameter in Java that points to
  // the address of the passed object. It has the following form:
  // modbus_construct(packet, id, function, address, data, register array)
  
  // For functions 1 & 2 data is the number of points
  // For functions 3, 4 & 16 data is the number of registers
  // For function 15 data is the number of coils
  
  // read 1 register starting at address 0  
  //modbus_construct(packet1, 1, READ_HOLDING_REGISTERS, 1, 1, readRegs);
  
  // write 1 register starting at address 1  
  //                 [ID], [Function 16], [NO OF REGISTERS], [NO OF BYTES]
  modbus_construct(packet1, 1, PRESET_MULTIPLE_REGISTERS, 1, 1, writeRegs1);
  modbus_construct(packet2, 1, PRESET_MULTIPLE_REGISTERS, 2, 1, writeRegs2);
  modbus_construct(packet3, 1, PRESET_MULTIPLE_REGISTERS, 3, 1, writeRegs3);
  modbus_construct(packet4, 1, PRESET_MULTIPLE_REGISTERS, 4, 1, writeRegs4);
  
  // P.S. the register array entries above can be different arrays
  
 while (!Serial) { ; } 
 modbus_configure(&Serial1, baud, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS);
  
 pinMode(LED, OUTPUT);
//________________________________________________________________________________________  
}

void loop()
{
  
 //_____________________________________MODBUS____________________________________________ 


      if (Serial.available()>4)
        {
 for (q=0; q<5; q++) 
 {         // for each byte
  bufferArray[q] = Serial.read();        // put into array
     } 
  }
   if (bufferArray[0] =='S' ){      // if new bytes have been recieved

   writeRegs1[0] = (encoderValue[0]+127)-bufferArray[1];
   writeRegs2[0] = (encoderValue[1]+127)-bufferArray[2];
   writeRegs3[0] = (encoderValue[2]+127)-bufferArray[3];
   writeRegs4[0] = (encoderValue[3]+127)-bufferArray[4];
  }
  
 modbus_update();
       
  

 analogWrite(LED, readRegs[0]>>2); // constrain adc value from the arduino slave to 255
  
  // You can check or alter the internal counters of a specific packet like this:
packet1->requests;
packet1->successful_requests;
packet1->failed_requests;
packet1->exception_errors;
// packet2->requests;
// packet2->successful_requests;
// packet2->failed_requests;
// packet2->exception_errors;
//________________________________________________________________________________________ 
}

Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»