ModBus
Re: ModBus
Поставил первый вариант, но там почему-то справку (chm-файл) невозможно вообще посмотреть, дерево отображается, а вместо документов пустое белое поле где найти справку к ней?
Race conditions - опасный и скользкий баг!
Re: ModBus
Во, оказывается файл cправки работает только тот, что в папке 71, а из остальных - нет, хотя размер и дата у них те же... (правда хеш не смотрел).
Race conditions - опасный и скользкий баг!
Re: ModBus
Что-то не работает через эту биб-ку. Сделал простую прогу для чтения первого Модбас-регистра ПЛК. TCP соединение открывается нормально (айпи и порт ПЛК указаны верно), но считать значение не может, выдаёт ошибку. Судя по сообщению, вроде как превышен таймаут (150 мс), ставил его и больше, бесполезно. Вообще сам ПЛК отвечает за единицы мс, если всё нормально... Ещё не понятно, где в этой биб-ке задать slave-адрес Модбас опрашиваемого устройства (у ПЛК он равен 1). Юзаю 2012 Pro.
Сам прикладываю.
Сам прикладываю.
- Вложения
-
- Модбас.vi
- (14.07 КБ) 227 скачиваний
Race conditions - опасный и скользкий баг!
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: ModBus
Модбас Адрес ПЛК указывается в "MBAP Header/Unit ID" MB Ethernet Master Query Write Multiple Registers (poly).vi и прочих
Re: ModBus
Судя по той бурде, что написана в справке про этот вход, даже и не поймёшь (например, "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 - опасный и скользкий баг!
Re: ModBus
Спасибо, поставил там 1 в Unit ID и всё отлично заработало! А вообще, корректно ли составлена моя прога для связи, правильно ли обслуживается соединение, в данном простейшем случае?
Race conditions - опасный и скользкий баг!
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: ModBus
Правильнее, наверное, пытаться поддерживать соединение. Это один из моих тестовых . Вам нужно только вместо чтения TCP вставить чтение Modbus.
Re: ModBus
Кстати, попробовал повыдёргивать сетевой кабель из ПЛК и отключать ПЛК - после повторного включения связь всегда восстанавливалась. Когда она может порваться окончательно?
Race conditions - опасный и скользкий баг!
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: ModBus
Обычно ПЛК поддерживает только одно соединение с одного IP адреса. Поэтому при попытке одновременной работы с ПЛК на рабочей станции и через программу и через, например, OPC, будут обрывы. Скорее всего с ошибкой 66. Может, 62. Также может потребоваться использовать одно соединение и на чтение и на запись, и контроль либо семафорами, либо работа явно последовательно. в одном цикле. Вообще сетевых ошибок десятка два (Забиваете в Expline Error коды с ~40 по 100 и смотрите, какие из них относятся к сети). Правильнее было-бы их как-то обрабатывать. Какие-то лечатся пересоединением, какие-то нет. Какие-то вообще малореальные.
Re: ModBus
Как отключить само окно с ошибкой (оно появляется, если до нажатия на кнопку Stop связь находилась в состоянии ошибки), которое появляется уже после нажатия? Почему оно вообще появляется, у меня ведь в программе после выхода из цикла - только закрытие TCP-соединения, и никакого сигнализатора ошибок и т. п. нет...
Race conditions - опасный и скользкий баг!
Re: ModBus
Оказалось, всё-таки она не всегда восстанавливается, причём независимо соотношения длительности отключения и таймаута, указанного при открытии ТСР-соединения.Кстати, попробовал повыдёргивать сетевой кабель из ПЛК и отключать ПЛК - после повторного включения связь всегда восстанавливалась
Race conditions - опасный и скользкий баг!
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: ModBus
Диалог с ошибкой выскакивает тогда, когда у последнего VI, на котором она появляется, вывод ошибки никуда не подключен.
-
- interested
- Сообщения: 5
- Зарегистрирован: 30 мар 2015, 21:33
- Версия LabVIEW: 09
- Контактная информация:
Re: ModBus
доброго времени суток
возникла такая задача: соединить контроллер arduino duo i , причем мастер сам контроллер, а в качестве slave,
схема такая: контроллер подключен к ПК (usb), контроллер посылает сигнал через RS-485/usb конвертер (конвертер определен как com port)
режим MODBUS RTU, все работает и данные передаются нормально проверено на программе ModBus slave(mosbustools), но нужно подключить
к . Пробовал библиотечные примеры (MB Serial Example Slave.vi) связь не устанавливается, Slave не отвечает
грешу на конвертер, возможна причина в нем
кто сталкивался?
задача запись в Holding registers
Вот фрагменты кода Мастера
возникла такая задача: соединить контроллер arduino duo i , причем мастер сам контроллер, а в качестве slave,
схема такая: контроллер подключен к ПК (usb), контроллер посылает сигнал через RS-485/usb конвертер (конвертер определен как com port)
режим MODBUS RTU, все работает и данные передаются нормально проверено на программе ModBus slave(mosbustools), но нужно подключить
к . Пробовал библиотечные примеры (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;
//________________________________________________________________________________________
}
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 19 Ответы
- 7875 Просмотры
-
Последнее сообщение Artem.spb
-
- 38 Ответы
- 13300 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 5 Ответы
- 250 Просмотры
-
Последнее сообщение IvanLis