PDA

Просмотр полной версии : Массив регистров ModBus



Seyran
26.05.2020, 15:03
как можно получить все регистры ModBus одним массивом ?

Seyran
27.05.2020, 06:50
как к нему обратиться, в этом и есть вопрос

VladGC
27.05.2020, 07:47
как к нему обратиться, в этом и есть вопрос

Вот тут гляньте, есть пример
https://www.youtube.com/watch?v=OxC8_HwU8Dw&list=PL8fcd73T0grFmTfcW5FoOpe3ddTdoIzVR&index=3

Seyran
27.05.2020, 08:12
ссылка интересная, но немного не то, либо я все таки не понимаю. У меня контроллер slave устройство, и у него в конфигурации описан массив регистров. Так вот именно как получить ссылку на адрес первого байта этого массива.

VladGC
27.05.2020, 08:39
ссылка интересная, но немного не то, либо я все таки не понимаю. У меня контроллер slave устройство, и у него в конфигурации описан массив регистров. Так вот именно как получить ссылку на адрес первого байта этого массива.
https://youtu.be/OxC8_HwU8Dw?list=PL8fcd73T0grFmTfcW5FoOpe3ddTdoIzV R&t=500
Под рукой CDS2.3 нет, но логика такая:
В месте где создается переменная слейва, создаете переменную типа string с нужной длинной, это и есть размер массива, далее ковыряете как надо этот string.

В видео пример для случаев если вы хотите опросить диапазон адресов с разными типами данных

Есть описание девайса, того места где описан этот массив ?

Seyran
27.05.2020, 08:59
в видео описан случай для мастера, и строка создается в конфигурации, и в нее как раз читается массив данных сразу из слейв устройства. В моем случае как раз то же хочу сделать, но походу туплю. Вот начинаются регистры
FAIL_REG1 AT %QW7.1.0:WORD; (*adrr 001 ;*)
FAIL_REG2 AT %QW7.2.0:WORD; (*adrr 002*)
FAIL_REG3 AT %QW7.3.0:WORD; (*adrr 003 *)
STATE_REG1 AT %QW7.4.0:WORD; (*adrr 004 *)
STATE_REG2 AT %QW7.5.0:WORD; (*adrr*)
STATE_REG3 AT %QW7.6.0:WORD; (*adrr *)

они идут подряд 38 штук разных типов WORD и DWORD(Real), как мне их завернуть в строку для отправки

VladGC
27.05.2020, 09:09
в видео описан случай для мастера, и строка создается в конфигурации, и в нее как раз читается массив данных сразу из слейв устройства. В моем случае как раз то же хочу сделать, но походу туплю. Вот начинаются регистры
FAIL_REG1 AT %QW7.1.0:WORD; (*adrr 001 ;*)
FAIL_REG2 AT %QW7.2.0:WORD; (*adrr 002*)
FAIL_REG3 AT %QW7.3.0:WORD; (*adrr 003 *)
STATE_REG1 AT %QW7.4.0:WORD; (*adrr 004 *)
STATE_REG2 AT %QW7.5.0:WORD; (*adrr*)
STATE_REG3 AT %QW7.6.0:WORD; (*adrr *)

они идут подряд 38 штук разных типов WORD и DWORD(Real), как мне их завернуть в строку для отправки

Я понял ваш вопрос :)
По сути, ничего делать не надо,
пусть ваши 38 word, dword так ими и остаются, ведь что массив, что строка, для вашего слейва ничего делать не надо.
Мастер и так опросит весь диапазон сразу, как в видео.
Если вам хочется массив который уже собран в программе представить как массив для опроса, что бы вручную не писать, то пока без среды разработки не подскажу

Seyran
27.05.2020, 09:25
немного не так, мне надо все эти регистры завернуть в строку чтобы записать в лог. Не хочу перечислять по отдельности каждый регистр, ибо при добавлении нового регистра есть шанс забыть добавить его в логгирование

Seyran
27.05.2020, 10:29
сделал так
VAR
mbBuff: POINTER TO ARRAY[1..68] OF WORD;
Massiv: ARRAY[0..68] OF BYTE;
END_VAR

mbBuff := ADR(FAIL_REG1);
Massiv := mbBuff^;

вот теперь как Massiv или mbBuff преобразовать в строку ???

Seyran
27.05.2020, 13:12
в тоге преобразование сделал так
FOR i:=0 TO 68 DO
aMyStringArray[i] := WORD_TO_STRING(Massiv[i]);
str := CONCAT(str,aMyStringArray[i]);
str := CONCAT(str, ';');
END_FOR
но в строке одни нули (((

Seyran
27.05.2020, 13:23
переделал вот так
str := '';
FOR i:=1 TO 68 DO
str := CONCAT(str, WORD_TO_STRING(Massiv[i]));
str := CONCAT(str, ';');
END_FOR

в итоге в Massiv попадают значения, а при преобразовании в строку не помещаются все значения, примерно 30 регистров

ferret_maybe
27.05.2020, 15:26
переделал вот так
str := '';
FOR i:=1 TO 68 DO
str := CONCAT(str, WORD_TO_STRING(Massiv[i]));
str := CONCAT(str, ';');
END_FOR

в итоге в Massiv попадают значения, а при преобразовании в строку не помещаются все значения, примерно 30 регистров
Если не ошибаюсь, то для переменной типа string размер по умолчанию в 80 символов.
При объявлении попробуйте сделать так:
str: string(136);

Seyran
27.05.2020, 15:58
спасибо, так и сделал, я не правильно спросил, имелось в виду как поменять при исполнении длину строки, оказалось нельзя. В итоге отказался от отправки строк, и решил отправлять по сети массив байт, а на серверной стороне распарсить как надо и залоггировать в базу. Так что всем спасибо, вопрос решен