PDA

Просмотр полной версии : овен и линукс



miko
03.03.2011, 07:08
1) есть ли какие-нибудь методы с оным в линуксе?
2) если есть, то как?
3) если овен подключить через MOXA, то можно ли получить данные по реалком порту, или же по TCP/IP ?

есть ли какие-нибудь наработки или мануалы по данной тематике?

Филоненко Владислав
03.03.2011, 09:45
1) Работа по протоколу ОВЕН в Линукс ничем не отличается от форточек.
2) в соответствии с протоколом
3) почему бы и нет?

miko
03.03.2011, 11:06
примеры на перле можете продемонстрировать?
так как интересует именно перл.

Малышев Олег
03.03.2011, 11:35
1) есть ли какие-нибудь методы с оным в линуксе?
C онным методы работы есть, особенно если написать
ОННЫЙ = ПЛК/ТРМ/СИ/РМ/... модификация ....
хотя бы для чего прибор нужен
Линукс = сервер, дескотоп, модификация ...

вообще на вскидку большинство приборов овен поддерживает модбас протокол. для него можно нагуглить кучу всего

miko
03.03.2011, 12:40
В целом задача такая: есть MOXA NPort 5150 которая создаёт RealCOM порт, с которым можно работать и снимать данные в моём случае с мв110-8ас.
Задача состоит лишь в том, чтобы собрать данные с овена, по заданному адресу.
Принципиальной разницы нет по ком порту это сделать или же по TCP/IP...

warm
09.03.2011, 13:51
1) есть ли какие-нибудь методы с оным в линуксе?
C онным методы работы есть, особенно если написать
ОННЫЙ = ПЛК/ТРМ/СИ/РМ/... модификация ....
хотя бы для чего прибор нужен
Линукс = сервер, дескотоп, модификация ...

вообще на вскидку большинство приборов овен поддерживает модбас протокол. для него можно нагуглить кучу всего

Ну вот у нас с топикстартером чё-то не получается нагуглить ничего юзабельного.

1. Работает только modpoll (http://www.focus-sw.com/fieldtalk/modpoll.html), но он не-open_source, библеотека его стОит 300 баксов. Нам в ТЗ указали чтобы совсем бесплатно было. Ещё его раздают только 32-битный.

2. Есть в перле модуль Modbus::Client, он не то чтобы совсем не работает, но данные пока с него получить не удалось. Если указать парвильный адрес девайса, то скрипт на этом модуле просто молча ничего не делает(считыветпустоту), если указать неправильный адрес, то ругается :).

3. Ещё пытался заюзать rmodbus (модуль для ruby), но ничего не получилось, что-то с самим руби или модулем.

4. libmodbus - пробовал его примеры, но тоже безуспешно.

5. Можно использовать *SCADA, что сейчас и делается, но это ядерный удар по шайке воробьёв - датчиков всего несколько десятков.

Хотелось бы найти открытую реализацию библеотеки или модуля modbus, которая бы работала с OWEN. Есть странное ощущение, что почти все перечисленные реализации могут работать, но не с любыми устройствами на modbus - для чего-то же их написали люди.

capzap
09.03.2011, 13:56
jamod.jar работает как с СОМ-портами, так и с ТСР и примеры есть достаточно дружественны для начинающих

warm
10.03.2011, 13:01
С libmodbus вроде бы чё-то получилось. Нет нормального описания функций и их назначения, всё по наитию ... и гуглу :-).

По крайней мере выдаёт почти то же самое, что и modpoll (запускаются не одновременно, поэтому младжий регистр отличается)

антиэталонный код:

---------------<cut>----------------
#include [stdio.h] // треугольные скобки считаются тегами
#include [modbus.h] // и фильтруются форумом:confused:
#include [errno.h]

int main () {

int i;
modbus_t *mb;
uint16_t tab_reg[32];

// Inicialization!
for (i = 0 ; i < 32 ; i++) { tab_reg[i] = 0; }

mb = modbus_new_rtu("/dev/ttyS0", 38400, 'N', 8, 1);

if (mb == NULL) {
fprintf(stderr, "Unable to allocate libmodbus context\n");
return -1;
}

// set address
modbus_set_slave(mb, 71);

if (modbus_connect(mb) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(mb);
return -1;
}

/* Read registers from the address */
modbus_read_registers(mb, 287, 3, tab_reg);

for (i = 0 ; i < 32 ; i++) {
if (tab_reg[i] != 0) {
printf ("i = %d %X \n", i, tab_reg[i]);
}
}

modbus_close(mb);
modbus_free(mb);
} //main
---------------<cut>----------------

Потом gcc test.c `pkg-config --libs --cflags libmodbus`
и потом:

C]# ./a.out ; /root/src/modbus/modpol/linux/modpoll -m rtu -a 71 -r 288 -c 3 -t 3:hex -1 -b 38400 -p none /dev/ttyS0
i = 0 F007
i = 1 4754
i = 2 A300

modpoll - FieldTalk(tm) Modbus(R) Polling Utility
Copyright (c) 2002-2006 FOCUS Software Engineering Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: Modbus RTU
Slave configuration...: Address/Id = 71, start reference = 288, count = 3
Communication.........: /dev/ttyS0, 38400, 8, 1none
Data type.............: 16-bit register (hex), input register table

Polling slave ...
[288]: 0xF007
[289]: 0x4754
[290]: 0xA300

Первые два регистра совпадают всегда, третий - редко, наверное из-за неодновременности снятий показаний отличается. Ещё непонятно. почему регистр 288 в libmodbus стал 287. Наверное надо считать с нуля как программисты :-).

warm
13.03.2011, 11:09
Теперь новая проблема: как из регистров и их значений

[288]: 0xF007
[289]: 0x4754

получить 54512.027344 ? Что-то никак не получается. Я не знаю, где какой endian и как "соединять" регистры. Вопрос наверное уже 1000 раз на форуме задавался, но всё же: как получить с девайса те же данные, которые выдаёт программа калибровки ? Ярык программирования С, ОС linux.

Ну и второй вопрос: в процессе юстировки прибор запоминает значения корректировки или нужно записывать значения корректировки и использовать их в софте ?

Малышев Олег
13.03.2011, 22:06
float a;
char *from;
char *to;
to=&a;
to[1]=from[0];
// ну и т д согласно модбас

leshyi
21.09.2011, 21:27
Коллеги, в продолжение темы.
Мучаюсь с libmodbus.org (3.0.1)
Программа:


#include <modbus/modbus.h>
#include <stdio.h>
#include <errno.h>

int main () {
modbus_t *st;
uint16_t tab_reg[32];
int rc;
int i;
struct timeval old_response_timeout;
struct timeval response_timeout;

st = modbus_new_tcp("10.10.10.6", 502);
if (st == 0) {
fprintf(stderr, "Error\n");
return -1;
}
if (modbus_connect(st) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(st);
return -1;
}

//modbus_get_response_timeout(st, &old_response_timeout);
//response_timeout.tv_sec = 10;
//response_timeout.tv_usec = 0;
//modbus_set_response_timeout(st, &response_timeout);

/* БД, адрес, кол-во регистров, куда пишем */
rc = modbus_read_registers(st, 0, 10, tab_reg);
if (rc == -1) {
printf("rc=%d\n", rc);
fprintf(stderr, "%s\n", modbus_strerror(errno));
// return -1;
}

for (i = 0 ; i < 10 ; i++) {
printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);
}

modbus_close(st);
modbus_free(st);
}

Соответственно: gcc test.c `pkg-config --libs --cflags libmodbus`
Соединяется нормально, при опросе регистров возвращает -1:


:./a.out
rc=-1
Connection timed out
reg[0]=0 (0x0)
reg[1]=0 (0x0)
reg[2]=0 (0x0)
reg[3]=0 (0x0)
reg[4]=0 (0x0)
reg[5]=0 (0x0)
reg[6]=0 (0x0)
reg[7]=0 (0x0)
reg[8]=59656 (0xE908)
reg[9]=64905 (0xFD89)

А должен быть (modpoll -r 1 -c 4 -t 3:hex -m tcp 10.10.10.6):


modpoll 3.1 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright (c) 2002-2011 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: MODBUS/TCP
Slave configuration...: address = 1, start reference = 1, count = 4
Communication.........: 10.10.10.6, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register (hex), input register table

-- Polling slave... (Ctrl-C to stop)
[1]: 0xCCCD
[2]: 0x4221
[3]: 0x0014
[4]: 0x0001

Может кто подскажет, что не так?

capzap
22.09.2011, 00:01
А на ПЛК есть 10 регистров в слейве?
А еще может быть: регистр это 2 байта, т.е. 16 бит, Вы сделали tab_reg равным 32 битам, а в запросе спрашиваете 10 регистров,т.е. 80 бит, ну как то поэтому должна быть ошибка

AndreyS
13.07.2013, 19:12
есть вот такая программа для опроса приборов по Modbus через различные интерфейсы (TCP/RS232/RS485). Она собственно тоже основана на libmodbus. Нами используется для опроса нескольких ПЛК из под Linux.
В принципе, в Perl скрипт интегрировать ее можно без проблем. =)
https://github.com/AndreySV/check_modbus

Thorn
05.09.2013, 22:11
Коллеги, в продолжение темы.
Мучаюсь с libmodbus.org (3.0.1)
Может кто подскажет, что не так?Понятно что некропост, но вероятно кому-то сэкономит время. В приведённом leshyi примере необходимо перед modbus_connect поставить вызов modbus_set_slave, несмотря на то что "man modbus_set_slave" говорит что в случае TCP "The slave number is only required in TCP if the message must reach a device on a serial network.". Похоже в случае с Овеном это обязательно. После вставки этой строки всё сразу заработало и на чтение и на запись а до того было "Connection timed out".

gri
30.06.2014, 03:02
Модбас может не работать потому, что самим прибором не поддерживается. А как понять что ТРМ138 поддерживает modbus или нет я не в курсе? В меню полазил - никаких переключений по этому поводу не нашел?