Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Когда данные приходят от нескольких МВА, в String input очередность байт будет сначала по первому МВА и тд.?
Чтобы мне получить я создаю тип:
И в цикле заполняю all_ai поочереди элементами ai?Код:TYPE AI : STRUCT ai : ARRAY[1..8] OF struct_ai; END_STRUCT END_TYPE all_ai:ARRAY[1..10] OF AI;
Хотя проще наверное сделать на каждый МВА отдельный String input.
Последний раз редактировалось senkos; 01.08.2023 в 11:29.
Просто так не получится, потому, что original_8AC AT %QB6.1.0.0 : struct_original_8AC; адрес жёстко прописан.
А вам надо адрес менять, как у остальных String, которые надо добавить
и ещё добавить UMD (универсал модбас девайс) с адресами как у модулей, в которые String и добавить.
Последний раз редактировалось kondor3000; 01.08.2023 в 14:33.
Из-за строгой привязки к адресам пришлось таким костылем сделать:
Создал 7шт UMD со String input.
Подскажите пожалуйста можно ли константу вынести на уровень видимости GLOBAL?Код:VAR_GLOBAL original_8AC1 AT %QB6.1.0.0 : struct_original_8AC; original_8AC2 AT %QB6.2.0.0 : struct_original_8AC; original_8AC3 AT %QB6.3.0.0 : struct_original_8AC; original_8AC4 AT %QB6.4.0.0 : struct_original_8AC; original_8AC5 AT %QB6.5.0.0 : struct_original_8AC; original_8AC6 AT %QB6.6.0.0 : struct_original_8AC; original_8AC7 AT %QB6.7.0.0 : struct_original_8AC; END_VAR VAR original_8AC : ARRAY[1..CountCompressors] OF struct_original_8AC; all_ai : ARRAY[1..CountCompressors] OF AI; END_VAR original_8AC[1] := original_8AC1; original_8AC[2] := original_8AC2; original_8AC[3] := original_8AC3; original_8AC[4] := original_8AC4; original_8AC[5] := original_8AC5; original_8AC[6] := original_8AC6; original_8AC[7] := original_8AC7; FOR k := 1 TO CountCompressors DO FOR i := 1 TO 7 DO all_ai[k].ai[i].status := original_8AC[k].SRD[i]; all_ai[k].ai[i].cyclic := original_8AC[k].Read[i,3]; p := ADR(all_ai[k].ai[i].value); p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2]; END_FOR END_FOR
Можно ли в цикле обработать вот эту часть:
Нельзя например как то использовать переменные в адресе %QB6.i.0.0Код:VAR_GLOBAL original_8AC1 AT %QB6.1.0.0 : struct_original_8AC; original_8AC2 AT %QB6.2.0.0 : struct_original_8AC; original_8AC3 AT %QB6.3.0.0 : struct_original_8AC; original_8AC4 AT %QB6.4.0.0 : struct_original_8AC; original_8AC5 AT %QB6.5.0.0 : struct_original_8AC; original_8AC6 AT %QB6.6.0.0 : struct_original_8AC; original_8AC7 AT %QB6.7.0.0 : struct_original_8AC; END_VAR
Я просто не уловил пока разницы в вашем новом коде, извините, но ткните пожалуйста в суть.
Вы сразу стали использовать двухмерный массив, но так как мне не очень удобно работать с ними, я создал объект AI, а массив его по сути реализует этот же двухмерный массив из ai. Шарпист я )) не могу без объектов ))
Последний раз редактировалось senkos; 02.08.2023 в 10:16.
Теперь используется только 1 адрес первого String АТ%QB6.1.0.0, он имеет длину 79 байт, у нас было original_8AC (SRD+Read) =64 байта, для выравнивания структуры добавлен x : string(15); //нужный мусор. Итого 79 байт.
И чтение 2 original_8AC (SRD+Read ) начнётся с 0 регистра второго String, автоматически.
То есть ваш костыль можно выкинуть и читать все 7 блоков или больше без проблем.
Естественно UMD расположить по порядку адресов модулей и String, тоже будут по порядку, один за другим.
Последний раз редактировалось kondor3000; 02.08.2023 в 14:29.
Благодарю! Вот это обалденный паттерн, а есть какие книги или мануалы про это? Интересует что нужно изучить чтобы самостоятельно дойти до такого решения, так как на подсказках много не накодишь.
Но UMD на каждое устройство создавать нужно со String input и адресом slave устройства?
Последний раз редактировалось senkos; 02.08.2023 в 11:39.
Последний раз редактировалось kondor3000; 02.08.2023 в 14:33.