PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [40] 41 42

kondor3000
25.07.2023, 10:42
Здравствуйте, вот такие 2 ошибки не подскажите, как решить

Вероятно точку случайно поставили в переменной BOOL, а битовый доступ делается из переменной, например типа WORD.
Но скрин урезан сильно, откуда и куда идёт не видно. Проект выложите.

Doffy
25.07.2023, 11:59
Вероятно точку случайно поставили в переменной BOOL, а битовый доступ делается из переменной, например типа WORD.
Но скрин урезан сильно, откуда и куда идёт не видно. Проект выложите.

Там все в одном фб так что лагает мама не горюй

petera
25.07.2023, 12:16
Там все в одном фб так что лагает мама не горюй

Нельзя у переменной BOOL найти какие-то разряды (in_v.0 - in_v.32)
Поменяй тип на DWORD

69174

senkos
26.07.2023, 19:56
Здравствуйте. Помогите пожалуйста понять теорию получения данных в ПЛК110 от МВ110-8АС.
В документации читаю что каждый вход на МВ рассматривается как отдельное устройство. Но тут же на форуме читаю как получить за один запрос данные по всем входам МВ. В какой форме приходит ответ в ПЛК от 8 датчиков 4..20мА? Например добавляю в UMD два элемента String input по 24 регистра каждый, как в примере у condor3000. Понимаю что в каждый стринг поступит 48 байт единичек и нулей. Как мне понять где лежит информация по каждому датчику и сколько байт она будет содержать?

kondor3000
26.07.2023, 20:28
Здравствуйте. Помогите пожалуйста понять теорию получения данных в ПЛК110 от МВ110-8АС.
В документации читаю что каждый вход на МВ рассматривается как отдельное устройство. Но тут же на форуме читаю как получить за один запрос данные по всем входам МВ. В какой форме приходит ответ в ПЛК от 8 датчиков 4..20мА? Например добавляю в UMD два элемента String input по 24 регистра каждый, как в примере у condor3000. Понимаю что в каждый стринг поступит 48 байт единичек и нулей. Как мне понять где лежит информация по каждому датчику и сколько байт она будет содержать?

Для начала скачайте руководство МВ110-8АС и посмотрите адреса регистров, они тут совершенно другие, соответственно и String input тут будет с другим числом байт и другим начальным адресом.
https://owen.ru/product/moduli_analogovogo_vvoda_s_bistrimi_vhodami_s_inte rfejsom_rs_485/documentation_and_software

Теория по работе со String тут https://owen.ru/forum/showthread.php?t=22915&page=40&p=244022&viewfull=1#post244022

Например адрес Str14 будет 256, соответственно число в Str14[0]= числу в регистре 256 ( w1:=w_1^[0]; ) и т. д.

Cs-Cs
26.07.2023, 20:56
senkos В начале МОЕЙ темы, на которую все ссылаются с примером от kondor3000, лежит готовый проект ПЛК с примером и подробными комментариями.

senkos
26.07.2023, 20:57
Для начала скачайте руководство МВ110-8АС и посмотрите адреса регистров, они тут совершенно другие, соответственно и String input тут будет с другим числом байт и другим начальным адресом.
https://owen.ru/product/moduli_analogovogo_vvoda_s_bistrimi_vhodami_s_inte rfejsom_rs_485/documentation_and_software


Предполагаю мне данную таблицу нужно смотреть, но как разобраться в ней.69238

Спасибо вам, попробую разобраться и понять суть.
Но все же не понятно в этой таблице какие регистры использовать мне для чтения, например iRD - 0x100....0x107, iRDt - 0x108....0x117, Read - 0x120....0x137

kondor3000
26.07.2023, 21:44
Предполагаю мне данную таблицу нужно смотреть, но как разобраться в ней.

Спасибо вам, попробую разобраться и понять суть.
Но все же не понятно в этой таблице какие регистры использовать мне для чтения, например iRD - 0x100....0x107, iRDt - 0x108....0x117, Read - 0x120....0x137

Если вы видите адрес типа 0х100 (измеренное целое значение 1 канала, без смещения), то это адрес в HEX, открываете калькулятор в режиме программист набираете 100 в HEX,
переводите в DEC, получаете 256, десятичный адрес регистра, в котором лежит значение 1 канала.

Например адрес Str14 будет 256, соответственно число в Str14[0]= числу в регистре 256 ( w1:=w_1^[0]; ) и т. д.
Например вы получили значение 245, смещение вы задали 1 знак, делите 245 на 10, получаете температуру 24,5 градуса.

(0х118) 280 адрес - Статус 1 канала
288 адрес (0х120) - значение 1 канала Float ( 2 регистра, адреса 288 и 289), после перестановки регистров, получаете сразу температуру например 24,512856 градуса

Cs-Cs
26.07.2023, 21:50
Но все же не понятно в этой таблице какие регистры использовать мне для чтения, например iRD - 0x100....0x107, iRDt - 0x108....0x117, Read - 0x120....0x137
Если прям вот из этой таблицы - то iRD и SRD например.

senkos
27.07.2023, 08:53
Благодарю вас за помощь в понимании!
Правильно ли я понял, что если мне не обязательны большие и точные данные float, то я могу обойтись двумя байтами с командой iRD, где в регистре 0х100 будут лежать данные по первому каналу. Задав смещение точки 1, получу десятичную часть, соответственно потом разделив полученное значение на 10.
String input в данном случае будет один с начальным адресом 256 и количеством регистров 8 для получения данных с восьми каналов.
Или садись, два. Учи дальше! :)

Дополню понимание темы:
Чтобы мне получить "Статус результата" + "Данные" + "Смещение" в ответе, создаю два String input. В первый String помещаю Данные (0х100...0х107) + Статус (0х118....0х11F), то есть 256 начальный регистр и всего 32 регистра из которых 16 (0х108...0х117) регистров будут мне не нужны. Во второй String помещаю Смещение 8 (0х20...0х27) регистров.

senkos
27.07.2023, 13:44
Read => Float_32 (IEEE 754) – рез.изм +Word_16 (метка относительного времени, дискретность 10 мс)
Тут последние два байта это метка относительного времени. Она указывает условное время получения данных? Например для сравнения между каналами в одном ли ответе пришли данные по ним?
В данном случае чтобы получить правильное число Float регистры нужно переставлять?

senkos
28.07.2023, 15:58
Доброго дня всем!
На String input поступает ответ с МВ-8АC с 8-ми каналов. 4 регистра на каждый канал - это SRD+Read . Итого 32 регистра или 64 байта.
Подскажите пожалуйста в каком виде будет очередность элементов в POINTER TO ARRAY [0..31] WORD при адресации на String input?
Первые 4 элемента WORD это данные по первому каналу? или сначала 8 WORD-ов это SRD по всем каналам, потом 24 WORD-а это данные Read со всех датчиков?

Пока не имею возможности на практике проверить, вот хочу сначала эмулятор написать поступающих данных, чтоб начать их обработку в коде.

kondor3000
29.07.2023, 13:38
Доброго дня всем!
На String input поступает ответ с МВ-8АC с 8-ми каналов. 4 регистра на каждый канал - это SRD+Read . Итого 32 регистра или 64 байта.
Подскажите пожалуйста в каком виде будет очередность элементов в POINTER TO ARRAY [0..31] WORD при адресации на String input?
Первые 4 элемента WORD это данные по первому каналу? или сначала 8 WORD-ов это SRD по всем каналам, потом 24 WORD-а это данные Read со всех датчиков?

Пока не имею возможности на практике проверить, вот хочу сначала эмулятор написать поступающих данных, чтоб начать их обработку в коде.

сначала 8 WORD-ов это SRD по всем каналам, потом 24 WORD-а это данные Read со всех датчиков

Калькулятором переведите адреса и всё встанет на место ( в голове). Если бы вы внимательней читали мои посты, то этих вопросов уже не задавали.

senkos
30.07.2023, 11:37
struct_original_8AC //РЭ
SRD : array[1..8] of int;
Read : array[1..8,1..3] of word;
end_struct

original_8AC at %... : struct_original_8AC; //регистр 16#118



Благодарю вас за готовый код, вы опередили меня и ответили на следующий мой вопрос, который я как раз хотел задать про структуры :)
Но новичку в ST понять чужой код сложно, в данном случае для меня было неожиданно видеть двухмерный массив Read : array[1..8,1..3] of word
Вроде все понятно что три регистра для восьми каналов, но меня интересует теперь подкапотная часть, а в частности каким образом интерпретируется этот массив с original_8AC at %... : struct_original_8AC; //регистр 16#118

Если бы я написал например:

struct_original_8AC //РЭ
SRD : array[1..8] of int;
Read : array[1..24] of word;
end_struct

original_8AC at %... : struct_original_8AC; //регистр 16#118


по сути все так же работало бы, не учитывая изменения адресации в самом массиве?

senkos
30.07.2023, 11:47
Калькулятором переведите адреса и всё встанет на место ( в голове). Если бы вы внимательней читали мои посты, то этих вопросов уже не задавали.

Да действительно, перечитал снова ваши сообщения и в коде есть упоминание заполнения массива данными, сложно все моменты и тонкости уловить, меня смутило то что логически возможен и второй вариант, так как каждый канал как отдельное устройство и например сначала опрашивается 1 канал и записывается в стринг, потом 2, 3 и тд. Просто уточнял, спасибо!

kondor3000
30.07.2023, 12:40
Благодарю вас за готовый код, вы опередили меня и ответили на следующий мой вопрос, который я как раз хотел задать про структуры :)
Но новичку в ST понять чужой код сложно, в данном случае для меня было неожиданно видеть двухмерный массив Read : array[1..8,1..3] of word
Вроде все понятно что три регистра для восьми каналов, но меня интересует теперь подкапотная часть, а в частности каким образом интерпретируется этот массив с original_8AC at %... : struct_original_8AC; //регистр 16#118

Если бы я написал например:

struct_original_8AC //РЭ
SRD : array[1..8] of int;
Read : array[1..24] of word;
end_struct

original_8AC at %... : struct_original_8AC; //регистр 16#118


по сути все так же работало бы, не учитывая изменения адресации в самом массиве?

Вам придётся вручную, выделять каждый регистр и прописывать в переменную, потом переставлять регистры.
Код с циклом FOR в примере автоматически разложит переменные по местам и переставит регистры во всех каналах Float.

Вы забыли, что Статусы все идут по порядку, а переменные REAL вперемежку с циклическим временем, поэтому и взят двумерный массив.

senkos
30.07.2023, 13:04
Логику обработки массивов я понимаю.
Мне не понятна логика привязки полученных регистров на String input (at %…) к созданной нами структуре.
Получается в struct_original_8AC.SRD будут адреса первых 8 регистров, далее как пойдет распределение?
Мне тут нужно уяснить принцип чтоб в дальнейшем создавать правильные структуры.

kondor3000
30.07.2023, 13:11
Логику обработки массивов я понимаю.
Мне не понятна логика привязки полученных регистров на String input (at %…) к созданной нами структуре.
Получается в struct_original_8AC.SRD будут адреса первых 8 регистров, далее как пойдет распределение?
Мне тут нужно уяснить принцип чтоб в дальнейшем создавать правильные структуры.

Адрес структуры original_8AC это и есть адрес String input созданного в программе ( вам его надо прописать, посмотрев у себя).
Регистр [0] String input, это Регистр [0] структуры original_8AC, то есть повторяет все регистры String input.
Цикл FOR расставит регистры в нужном порядке в массиве ai : ARRAY[1..8] OF struct_ai; взятые из структуры original_8AC

senkos
31.07.2023, 11:04
Доброго дня всем! Продолжаю изучение и хотелось бы спросить очередного совета у профессионалов:
ПЛК110 (slave) + СП307(master)
ПЛК получает аналоговые данные от 10 устройств МВ110-8АС. Структура данных всех 10-ти устройств одинаковая.
На скрине я отобразил структуру данных которую запрашивает СП - это блок №1 и №2. Так же СП отправляет данные в ПЛК в виде уставок.
Верный ли подход такой, что мне нужно будет внести в конфигурацию ПЛК 10 таких блоков?69294

ps: только что заметил что Float начинаются не с правильного регистра СП, в начало добавить наверное нужно 2 байта еще

kondor3000
31.07.2023, 15:09
Доброго дня всем! Продолжаю изучение и хотелось бы спросить очередного совета у профессионалов:
ПЛК110 (slave) + СП307(master)
ПЛК получает аналоговые данные от 10 устройств МВ110-8АС. Структура данных всех 10-ти устройств одинаковая.
На скрине я отобразил структуру данных которую запрашивает СП - это блок №1 и №2. Так же СП отправляет данные в ПЛК в виде уставок.
Верный ли подход такой, что мне нужно будет внести в конфигурацию ПЛК 10 таких блоков?69294

ps: только что заметил что Float начинаются не с правильного регистра СП, в начало добавить наверное нужно 2 байта еще

Если блоки одинаковые, но с разными переменными, добавляйте 10 блоков, кто мешает. Хотя лучше было сделать все 8Bit, потом все 2 BYTE, потом все Float
Переменные Float должны быть с чётными адресами, у вас все с нечётными, просто следите за этим, добавьте 2 байта в начале.

petera
31.07.2023, 15:32
....
Переменные Float должны быть с чётными адресами, у вас все с нечётными, просто следите за этим, добавьте 2 байта в начале.

Можно руками не добавлять 2 байта в начало. Само все автоматом выравняется до ближайшего четного адреса, просто нужно это (автосмещение) учитывать при назначении адресов соответствующим элементам на экране панели.

senkos
01.08.2023, 11:06
struct_original_8AC //РЭ
SRD : array[1..8] of int;
Read : array[1..8,1..3] of word;
end_struct

original_8AC at %... : struct_original_8AC; //регистр 16#118

enum_status( //РЭ
status_ok := 0,
..
status_break := 16#F00D,
..
);

struct_ai
status : enum_status;
cyclic : word;
value : real;
end_struct

ai : array[1..8] of struct_ai;
p : pointer to dword;




for i := 1 to 8 do
ai[i].status := original_8AC.SRD[i];
ai[i].cyclic := original_8AC.Read[i,3];
p := adr(ai[i].value);
p^ := original_8AC.Read[i,1] * 16#10000 + original_8AC.Read[i,2];
end_for


Когда данные приходят от нескольких МВА, в String input очередность байт будет сначала по первому МВА и тд.?
Чтобы мне получить я создаю тип:


TYPE AI :
STRUCT
ai : ARRAY[1..8] OF struct_ai;
END_STRUCT
END_TYPE

all_ai:ARRAY[1..10] OF AI;


И в цикле заполняю all_ai поочереди элементами ai?

Хотя проще наверное сделать на каждый МВА отдельный String input.

kondor3000
01.08.2023, 14:17
Когда данные приходят от нескольких МВА, в String input очередность байт будет сначала по первому МВА и тд.?
И в цикле заполняю all_ai поочереди элементами ai?

Хотя проще наверное сделать на каждый МВА отдельный String input.

Просто так не получится, потому, что original_8AC AT %QB6.1.0.0 : struct_original_8AC; адрес жёстко прописан.
А вам надо адрес менять, как у остальных String, которые надо добавить
и ещё добавить UMD (универсал модбас девайс) с адресами как у модулей, в которые String и добавить.

senkos
01.08.2023, 14:54
Просто так не получится, потому, что original_8AC AT %QB6.1.0.0 : struct_original_8AC; адрес жёстко прописан.
А вам надо адрес менять, как у остальных String, которые надо добавить
и ещё добавить UMD (универсал модбас девайс) с адресами как у модулей, в которые String и добавить.

Из-за строгой привязки к адресам пришлось таким костылем сделать:
Создал 7шт UMD со String input.


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


Подскажите пожалуйста можно ли константу вынести на уровень видимости GLOBAL?

kondor3000
01.08.2023, 15:05
Из-за строгой привязки к адресам пришлось таким костылем сделать:
Создал 7шт UMD со String input.
Подскажите пожалуйста можно ли константу вынести на уровень видимости GLOBAL?
Там же в Глобальных
VAR_GLOBAL CONSTANT

END_VAR

senkos
02.08.2023, 10:01
Я человек простой. Вижу цикличность - делаю массив


VAR_GLOBAL //этот то накой глобал ?
original_8AC AT %QB6.1.0 : array[1..7] of struct_original_8AC;

---------
for k := 1 to 7 do
for i := 1 to 8 do
all_ai[k,i].status := original_8AC[k].SRD[i];
all_ai[k,i].cyclic := original_8AC[k].Read[i,3];
p := adr(all_ai[k,i].value);
p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2];
end_for
end_for

//для ПЛК110-М02


Можно ли в цикле обработать вот эту часть:


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


Нельзя например как то использовать переменные в адресе %QB6.i.0.0
Я просто не уловил пока разницы в вашем новом коде, извините, но ткните пожалуйста в суть.
Вы сразу стали использовать двухмерный массив, но так как мне не очень удобно работать с ними, я создал объект AI, а массив его по сути реализует этот же двухмерный массив из ai. Шарпист я )) не могу без объектов ))

kondor3000
02.08.2023, 10:31
Можно ли в цикле обработать вот эту часть:
Нельзя например как то использовать переменные в адресе %QB6.i.0.0
Я просто не уловил пока разницы в вашем новом коде, извините, но ткните пожалуйста в суть.
Вы сразу стали использовать двухмерный массив, но так как мне не очень удобно работать с ними, я создал объект AI, а массив его по сути реализует этот же двухмерный массив из ai. Шарпист я )) не могу без объектов ))

Теперь используется только 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, тоже будут по порядку, один за другим.

senkos
02.08.2023, 11:20
Теперь используется только 1 адрес первого String АТ%QB6.1.0.0, он имеет длину 79 байт, у нас было original_8AC (SRD+Read) =64 байта, для выравнивания структуры добавлен x : string(15); //нужный мусор. Итого 79 байт.
И чтение 2 original_8AC (SRD+Read ) начнётся с 0 регистра второго String, автоматически.
То есть ваш костыль можно выкинуть и читать все 7 блоков или больше без проблем.
Естественно блоки расположить по порядку адресов и String, тоже будут по порядку, один за другим.

Благодарю! Вот это обалденный паттерн, а есть какие книги или мануалы про это? Интересует что нужно изучить чтобы самостоятельно дойти до такого решения, так как на подсказках много не накодишь.


Теперь используется только 1 адрес первого String АТ%QB6.1.0.0

Но UMD на каждое устройство создавать нужно со String input и адресом slave устройства?

kondor3000
02.08.2023, 12:35
Благодарю! Вот это обалденный паттерн, а есть какие книги или мануалы про это? Интересует что нужно изучить чтобы самостоятельно дойти до такого решения, так как на подсказках много не накодишь.



Но UMD на каждое устройство создавать нужно со String input и адресом slave устройства?

Конечно нужно, только подряд. UMD расположить по порядку адресов модулей, например 16,17,18,19,20,21,22.
Адреса String будут тоже по порядку.

Чтобы дойти, надо знать структуру распределения памяти в ПЛК Овен или иметь большой опыт работы с данными ПЛК.

senkos
02.08.2023, 14:45
Чуть ранее

struct_original_8AC //++
command : dword; //6.1.0
SRD : array[1..8] of int;
Read : array[1..8,1..3] of word;
x : string(15); //нужный мусор
end_struct



Для чего в структуре прописана переменная command : dword; //6.1.0 ? С ней получается уже не 79 байт, а 83.

kondor3000
02.08.2023, 14:51
Проверил на 7 модулях МВ110-8АС, все работает с x : string(15);
В структуру не ставил command : dword; //6.1.0, на моём ПЛК и без него работает. ПЛК у меня старый, возможно для новых [М 02] он нужен.

По тому же принципу, сделал чтение 7 штук МВ110-8А. Так как там 2 String на чтение (по 48 байт), то структура получилась с двумя String(31) для выравнивания. Всё работает тоже.

senkos
02.08.2023, 15:12
Чтобы дойти, надо знать структуру распределения памяти в ПЛК Овен или иметь большой опыт работы с данными ПЛК.


original_8AC AT %QB6.1.0 : array[1..7] of struct_original_8AC;

Кажется я уловил мысль, в новой версии у нас указан адрес UMD - %QB6.1.0 но при этом адрес конкретного стринга на разряд "ниже" то есть %QB6.1.0.0
Получается происходит обращение не к конкретному стрингу, а к UMD по адресу %QB6.1.0
Только каким чудным образом ПЛК начинает считывать следующий UMD? Или он будет читать до тех пор пока не закончатся все UMD?
Предполагаю что %QB6.1.0 это начальный адрес с которого нужно произвести чтение в указанную переменную, количество байт как раз и указывает размер переменной и у нас она 7 по 79 байт = 553 байта.
Смущает еще такой момент, что у UMD есть 1 байт AT % QB6.1.0: BYTE; (*Command (0xff - Start) - это как раз и есть тот элемент в структуре command : dword; //6.1.0

kondor3000
02.08.2023, 15:28
original_8AC AT %QB6.1.0 : array[1..7] of struct_original_8AC;

Кажется я уловил мысль, в новой версии у нас указан адрес UMD - %QB6.1.0 но при этом адрес конкретного стринга на разряд "ниже" то есть %QB6.1.0.0
Получается происходит обращение не к конкретному стрингу, а к UMD по адресу %QB6.1.0
Только каким чудным образом ПЛК начинает считывать следующий UMD? Или он будет читать до тех пор пока не закончатся все UMD?
Предполагаю что %QB6.1.0 это начальный адрес с которого нужно произвести чтение в указанную переменную, количество байт как раз и указывает размер переменной и у нас она 7 по 79 байт = 553 байта.

В структуру не ставил command : dword; //6.1.0, на моём ПЛК и без него работает. ПЛК у меня старый, возможно для новых [М 02] он нужен.

Не надо гадать, надо делать и смотреть Онлайн, я уже всё проверил, если у вас будет смещение адресов, вы увидите во второй структуре original_8AC[2].
Вот скрин, все SDR=0 (Статус=ОК), смотрю 2 модуль, смещение правильное 69314
ПЛК работает циклически и опрашивает все UMD по кругу, так же как и выполняет программу.

У меня адрес 6.1.0 ( у меня это 13.1.0) поставить структуре нельзя, при компиляции сразу ошибка.

Вот что будет, если смещение не правильное, если добавить command : dword; или изменить String(15) данные из READ залезли наверх, на SDR 69315

kondor3000
02.08.2023, 19:37
to kondor3000, нету возможности посмотреть,
проверить всего лишь нужно
adr(%IB13.2.0.0) - adr(%IB13.1.0.0) => ?

В "старых" плк у command другой префикc (QB vs IB) => другая область памяти

Разница в адресах 80 байт ( c 0 по 79 ), а сколько в новых проверить не могу, нечем.
adr(%IB13.2.0.0) - adr(%IB13.1.0.0) =>80 69319

kondor3000
02.08.2023, 21:28
k := last_address; //И адреса бы так и забил. Упорядоченность облечает жизнь
case k of 1..7:

Зачем адреса перепрограммировать? Проще написать k := last_address-15;

senkos
08.08.2023, 11:13
Здравствуйте! Правильно ли я понимаю, что за один такт ПЛК опросит все UMD и при этом Last address изменится такое же количество раз сколько у нас UMD?

senkos
08.08.2023, 21:18
Ну вот попробуйте ответить сами на это учитывая что цикл ПЛК может быть 1мс (а на "старых" плк, блин, еще и меньше!), а самая эльфийская транзакция для модбас-rtu не меньше 3..4мс.

Если честно совсем не понимаю ваших ответов загадками. Polling time разве не задает время опроса?
Будьте добры объясните пожалуйста?
Этот вопрос связан с данным кодом:


k := last_address; //И адреса бы так и забил. Упорядоченность облечает жизнь
case k of 1..7:
for i := 1 to 8 do
all_ai[k,i].status := original_8AC[k].SRD[i];
all_ai[k,i].cyclic := original_8AC[k].Read[i,3];
p := adr(all_ai[k,i].value);
p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2];
end_for
end_case


в частности с CASE, он должен быть внутри нашего цикла или же сам плк исполнит этот CASE от 1 до 7?

senkos
08.08.2023, 22:22
Какой ПЛК на столе?


ПЛК110-24.30.Р-М (v2)

Habib_1
09.08.2023, 04:36
Здравствуйте! Подскажите пожалуйста как (и когда) можно менять свои права в форуме?
(Я не могу не опубликовать темы и писать сообщение)

cytadell
09.08.2023, 08:00
Здравствуйте. подскажите по такому вопросу. Имеется два контроллера ПЛК160 и ПЛК110 модификации M2. В течение года в каждом из них проявились неисправности схожего характера. Обе связаны с работой центрального SOM модуля. На первом, который SOM01C05 (ПЛК110) инициализация при включении терпит неудачу в 95% случаев. При детальном изучении смог выяснить, что причина в обвязке микросхемы памяти MX30LF1G0. Во втором модуле SOM01C04 (ПЛК160) подозрение также на сбой этой микросхемы. Там неисправность проявляется при попытке подключиться к программе CoDeSys, которая выдаёт сообщение что профиль-таргет подключения программы не соответствует целевой платформе физического ПЛК, к которому подключаюсь. Я попытался залить заводскую прошивку на контроллер, версия firmware_v1.1.0_bat. Все процедуры выполнял строго по мануалу: Инструкция по обновлению прошивки ПЛК1хх [М02].pdf. Попытка потерпела неудачу со следующим логом в командном окне:

[TYPE] UBL and application image
[UBL] ubl_AM1808_NAND_UNIVERSAL.bin
[APP IMAGE] 160_v1.1.0.bin
[TARGET] OMAPL138
[DEVICE] NAND
[NAND Block] 1

Attempting to connect to device COM2...
Press any key to end this program at any time.

(AIS Parse): Read magic word 0x41504954.
(AIS Parse): Waiting for BOOTME... (power on or reset target now)
(AIS Parse): BOOTME received!
(AIS Parse): Performing Start-Word Sync...
(AIS Parse): Performing Ping Opcode Sync...
(Serial Port): Read error! (Время ожидания операции истекло.)
(AIS Parse): I/O Error in read!
(AIS Parse): Boot aborted.
Booting SFT failed. Trying again (you may need to reset the target)...
(AIS Parse): Read magic word 0x41504954.
(AIS Parse): Waiting for BOOTME... (power on or reset target now)
(Serial Port): Read error! (Операция ввода/вывода была прервана из-за завершения
потока команд или по запросу приложения.
)
Для второго случая вероятно имеет место повреждение данных инициализации ПЛК.

Подскажите пожалуйста, каковы наши действия? Можем ли мы купить у вас данные модули для ремонта этих ПЛК?

kondor3000
09.08.2023, 08:39
Здравствуйте! Подскажите пожалуйста как (и когда) можно менять свои права в форуме?
(Я не могу не опубликовать темы и писать сообщение)

Вы же уже написали сообщение, значит можете.

kondor3000
09.08.2023, 08:41
Здравствуйте. подскажите по такому вопросу. Имеется два контроллера ПЛК160 и ПЛК110 модификации M2. В течение года в каждом из них проявились неисправности схожего характера. Обе связаны с работой центрального SOM модуля. На первом, который SOM01C05 (ПЛК110) инициализация при включении терпит неудачу в 95% случаев. При детальном изучении смог выяснить, что причина в обвязке микросхемы памяти MX30LF1G0. Во втором модуле SOM01C04 (ПЛК160) подозрение также на сбой этой микросхемы. Там неисправность проявляется при попытке подключиться к программе CoDeSys, которая выдаёт сообщение что профиль-таргет подключения программы не соответствует целевой платформе физического ПЛК, к которому подключаюсь. Я попытался залить заводскую прошивку на контроллер, версия firmware_v1.1.0_bat. Все процедуры выполнял строго по мануалу: Инструкция по обновлению прошивки ПЛК1хх [М02].pdf. Попытка потерпела неудачу со следующим логом в командном окне:
Подскажите пожалуйста, каковы наши действия? Можем ли мы купить у вас данные модули для ремонта этих ПЛК?

С такими вопросами, лучше пишите или звоните в тех поддержку сразу https://owen.ru/gruppa_tehnicheskoj_podderzhki
https://owen.ru/product/plk110_m02/question

kondor3000
09.08.2023, 10:39
Если честно совсем не понимаю ваших ответов загадками. Polling time разве не задает время опроса?
Будьте добры объясните пожалуйста?
Этот вопрос связан с данным кодом:
в частности с CASE, он должен быть внутри нашего цикла или же сам плк исполнит этот CASE от 1 до 7?
Проверил на 2 блоках, адреса 16 и 17. Замер делал раз 10, со сбросом ПЛК. Таймер включается в 1 цикле и останавливается по флагу х2.
Опрос 2 подключённых блоков занимает 8-10 ms. Проверил вживую на старом ПЛК. Время опроса не зависит от цикла программы ставил 1 и 3 ms69385
и не зависит от Поллинг ставил и 10 и 100 ms
CASE исполняется так же циклом, как и вся программа.

kondor3000
09.08.2023, 22:31
С 10-тью мсеками чегой-то как-то неясно. Там, часом, не Минцикл = 10 ?


r_trig(clk := last_error = 0 and k = 1);
if r_trig.q then
цикл_опроса := time() - t; //как-то по реальней
t := time();
end_if

Написал же

Время опроса не зависит от цикла программы ставил 1 и 3 ms.
и не зависит от Поллинг ставил и 10 и 100 ms
Подключены реально 2 блока и время опроса 8-10 ms измеряется для 2 блоков, то есть на один блок 4-5 ms, остальные не опрашиваются, так как last_address >17
Завтра проверю по новому.

iv.kmz
10.08.2023, 08:15
Здравствуйте!

На ПЛК200 копирую файл (из основного хранилища) на карту памяти используя SysFileCopy. При установленной карте файлы копируются без проблем. Проверял их наличие и содержимое на компьютере.

Проблема заключается в том, что файлы копируются и без установленной карты памяти. Причём SysFileGetSize даже правильно выдаёт их размер после копирования на отсутствующую карту. При этом, после выполнения pResult := SysFileCopy(DestFileName, FileName, pulCopied); pResult = 0 , pulCopied = 0 в обоих случаях (с установленной картой и без неё)

Мне нужно либо определить отсутствие карты памяти, либо подтверждение факта реального копирования файлов на карту.

Помогите пожалуйста советом

kondor3000
10.08.2023, 08:24
На ПЛК200 копирую файл (из основного хранилища) на карту памяти используя SysFileCopy. При установленной карте файлы копируются без проблем. Проверял их наличие и содержимое на компьютере.
Мне нужно либо определить отсутствие карты памяти, либо подтверждение факта реального копирования файлов на карту.
Помогите пожалуйста советом

Пишите в правильный раздел по ПЛК200 (среда CoDeSys V3.5) вам помогут.

iv.kmz
10.08.2023, 08:33
Пишите в правильный раздел по ПЛК200 (среда CoDeSys V3.5) вам помогут.

виноват. промахнулся

kondor3000
10.08.2023, 10:13
Что не зависит - я в курсе.
Опрос за 10мс 64 байт даже на 115200 сомнителен.
Старый ПЛК110-60. Мин. цикл ПЛК во всех случаях 3 ms. 115200 (8N1)
Вот скрин опроса 2 блоков (5 не подключены), но ПЛК пытается их читать, в среднем цикл опроса 800 ms и прыгает.69403


Вот выкинул всё, оставил 2 блока, цикл опроса около 100 ms 69404

То есть за 100 ms опросил 2 блока, а 700 ms потратил впустую, на опрос несуществующих блоков.

Те же 2 блока, уменьшил Поллинг со 100 до 10ms, цикл опроса стал около 25 ms 69405

senkos
11.08.2023, 16:10
чиста любопытно когда скатитесь до (например) modbus.lib и "заобъектируете" это всё и "засобыйтите". Тама еще красивше.

Интересно, нашел в сети несколько солюшенов и либ для C#, а возможно ли например писать код на шарпе и заливать весь алгоритм в ПЛК для последующей автономной работы без приложений и без компа. Как я понимаю шарп только дает возможность связи контроллера с компом, но конфигурировать ПЛК и записывать в него алгоритм все равно придется использовать ST и CodeSYS?

YuriBel
11.08.2023, 16:28
Не задавайте умных вопросов, чтобы не получать обидных ответов :)
Эта ветка посвящена ПЛК, которые программируются в среде Codesys2.3. Эти ПЛК не дают пользователю доступа к своей операционной системе. Остается вопрос, что, куда и чем вы собираетесь заливать?
Если вы думаете про ПЛК двухсотого семейства, где есть операционная система, то вам нужно задавать вопросы в соответствующей ветке, ну или в "курилке", как вариант.

Doffy
12.08.2023, 20:56
Здравствуйте, такой вопрос в эмуляторе все работает хорошо, а в доме «не очень», и в конфигурации посидел, добавил время опроса и тд, и на st с cfc перепесал, все четно(по подключению все хорошо)

kondor3000
12.08.2023, 21:38
Здравствуйте, такой вопрос в эмуляторе все работает хорошо, а в доме «не очень», и в конфигурации посидел, добавил время опроса и тд, и на st с cfc перепесал, все четно(по подключению все хорошо)

А вопрос то в чём? Вы как то конкретнее пишите, выложите проект и скринами покажите, что не так.

Habib_1
15.08.2023, 03:45
Опубликовать не могу темы, стоит ограничения

west
15.08.2023, 17:49
Опубликовать не могу темы, стоит ограничения
а это разве не пост?
точнее это уже второй пост с одной и той же "проблемой".

senkos
16.08.2023, 09:59
Зачем адреса перепрограммировать? Проще написать k := last_address-15;

Это если адреса наших слейвов начинаются с 16 и идут подряд 16,17,18,19...?
Чтобы начало отсчета k было с единицы?

kondor3000
16.08.2023, 10:18
Это если адреса наших слейвов начинаются с 16 и идут подряд 16,17,18,19...?
Чтобы начало отсчета k было с единицы?

Да, об этом писал уже несколько раз.

petera
16.08.2023, 10:33
Опубликовать не могу темы, стоит ограничения

Зависит от раздела форума, некоторые разделы не позволяют обычным пользователям создавать новые темы.
Например, в разделе "В продаже" https://owen.ru/forum/forumdisplay.php?f=28
нельзя
69624

а в раздел "ПЛК1хх [M02] https://owen.ru/forum/forumdisplay.php?f=85
можно
69626

ЗЫ.

а это разве не пост?
точнее это уже второй пост с одной и той же "проблемой".

Пост - это всего лишь одно сообщение, а тема - целая ветка с множеством постов.

alex191000
16.08.2023, 10:37
Добрый день, имеется панель NLcon-CED7, на ней установлен Debian 10. Делаю проект на версии Codesys 3.5 SP16 Patch 3.
Нужно чтобы проект перезаписывался и обновлялся с флешки, сейчас он записывается через LAN.
Как организовать запись с флешки?

senkos
16.08.2023, 11:57
да ёлки-палки, вы шарписто-программист или где
end_if[/CODE]

Благодарю вас всех кто помог разобраться с этим!
Теперь стало все понятно, сомневался в некоторых моментах, диссонанс испытываю тут вроде и низкий уровень и сразу же оборачивается в типа ООП.

senkos
16.08.2023, 13:31
В продолжение разобранной темы со STRING в ПЛК(мастер) и МВ(слейв) теперь необходимо подключить СП307 к данному ПЛК.
Как оптимально исполнить это: ПЛК-мастер и СП-слейв или наоборот?
1) Если ПЛК-мастер, то можно так же объявить String output modul и отправлять одним запросом на панель?
2) Если ПЛК-слейв, то необходимо будет сначала прописать все выходы а их будет 56 и считывать одним запросом на панели с помощью функциональной области?

В целом важен алгоритм отправки данных с датчиков которые у меня в массиве на панель:

compressors :ARRAY [0..7] OF COMPRESSOR;
TYPE COMPRESSOR :
STRUCT
bSignal1 :BYTE;
bSignal2 :BYTE;
t_1st :INT;
t_2st :INT;
t_oil :INT;
P_1st :REAL;
P_2st :REAL;
P_oil :REAL;
P_water :REAL;
END_STRUCT
END_TYPE

kondor3000
16.08.2023, 13:54
В продолжение разобранной темы со STRING в ПЛК(мастер) и МВ(слейв) теперь необходимо подключить СП307 к данному ПЛК.
Как оптимально исполнить это: ПЛК-мастер и СП-слейв или наоборот?
1) Если ПЛК-мастер, то можно так же объявить String output modul и отправлять одним запросом на панель?
2) Если ПЛК-слейв, то необходимо будет сначала прописать все выходы а их будет 56 и считывать одним запросом на панели с помощью функциональной области?
В целом важен алгоритм отправки данных с датчиков которые у меня в массиве на панель:
[/CODE]

Для работы с панелью слейвом, надо два UMD, для чтения и для записи ( поменять настройку Запись по изменению)
и отправить можно одним String, только данные одного типа, для 3 типов надо 3 String. 2 BYTE лучше объединить в 1 WORD, тогда 2 String. https://owen.ru/forum/showthread.php?t=22915&page=40&p=244022&viewfull=1#post244022

Для панели мастер можно создать в слейве, аналог массива ARRAY [0..7] OF COMPRESSOR; и отправить масссивом всё. 2 BYTE тоже лучше объединить.
У панели мастера есть недостаток, хоть один регистр с неверным адресом, будет сильно тормозить.

kondor3000
16.08.2023, 15:06
какое-то неправильное утверждение или я чего то непонял
String - просто набор байт. Что там отправляется и какие типы и в каких комбинациях - без разницы. Важен sizeof контента.

В принципе да, можно и всё подряд отправить, только с нюансами. Просто так удобней, не надо считать адреса регистров.
Байт в панели нет, 2 байт в панели будет как 1 WORD. Адреса каждого WORD и REAL надо будет высчитывать. Не сложно, но можно запутаться легко.
Одним String тоже всё не отправить, 96 регистров надо разбить на 3 части ( не более 40 регистров за раз) и ещё неудобней считать, так как 8 штук по 12 регистров.

Newcomer
16.08.2023, 15:15
Добрый день

Создаю новые проекты для PLC110.60-L V2 и PLC110.60-M V2, но в конфигурации ПЛК вижу одну и ту же картинку. Как это понимать ?

petera
16.08.2023, 15:19
Добрый день

Создаю новые проекты для PLC110.60-L V2 и PLC110.60-M V2, но в конфигурации ПЛК вижу одну и ту же картинку. Как это понимать ?

А что не так?
М или L никак в конфигурации не отображались и ранее (для не V2).

kondor3000
16.08.2023, 15:20
Добрый день

Создаю новые проекты для PLC110.60-L V2 и PLC110.60-M V2, но в конфигурации ПЛК вижу одну и ту же картинку. Как это понимать ?

Так и понимайте, одинаковые таргеты, просто у L ограничено число передаваемых регистров. В таргете это не отражается.

Newcomer
16.08.2023, 15:44
А что не так?
М или L никак в конфигурации не отображались и ранее (для не V2).

Тогда такой вопрос. Попал мне в руки проект. ПЛК110.60 живого на руках нет. Проект открылся в CODESYS. Как понять для какого он ПЛК, L или M ?

kondor3000
16.08.2023, 16:49
Тогда такой вопрос. Попал мне в руки проект. ПЛК110.60 живого на руках нет. Проект открылся в CODESYS. Как понять для какого он ПЛК, L или M ?

Открываете целевую платформу и смотрите какой таргет стоит. 69640 Просто смотрите, ничего не меняя.

kondor3000
16.08.2023, 19:20
А зачем считать ? Да и насчет удобства
8.Шмяк "таблица отображения данных"
9.Столбцами повторяем состав struct_ai (3 столбца)
10.Строк - 56
С панелью всё

Вот и посмотрим, сколько вопросов теперь по Панели будет))) Если что я про панель писал.
Вы со своей колокольни судите, а ему ( новичку) хотя бы 1-2 регистра правильно передать и без стрингов, а потом со стрингом))) в панель слейв.
А потом ещё в панель Мастер.

Cs-Cs
17.08.2023, 09:42
Влезу в ваши обсуждения. Я ща первый раз сам пробую панель заюзать, и пришёл к тому же, что Валенок советует - кучку фиговин по 4 Байта в Slave напихать.
Только мне НЕ нравится прямая адресация, и я сделал удобнее для себя: назначил первому из 4 Byte имя в конфигурации ПЛК, взял его адрес через ADR и присвоил указателю на данные. Так код будет прям совсем универсальным, ИМХО.

Валенок
17.08.2023, 14:17
Влезу в ваши обсуждения. Я ща первый раз сам пробую панель заюзать, и пришёл к ... - кучку фиговин по 4 Байта в Slave напихать..
Ну так логично - это просто определить кусок памяти для обмена. Были в слейве "string" - заюзали бы их. Для задачи выше - хватило бы десятка.


...
Только мне НЕ нравится прямая адресация, и я сделал удобнее для себя: назначил первому из 4 Byte имя в конфигурации ПЛК, взял его адрес через ADR и присвоил указателю на данные. Так код будет прям совсем универсальным, ИМХО.
Сначала я тоже так думал. После подумал и решил что at% 1 (один) раз - норм.
-код чище : Slave.чтото vs PSlave^.чтото
-код быстрее : Slave.чтото - прямое обращение, PSlave^.чтото - предварительное обращение к PSlave

А универсальностью я переболел давно. Характерный признак болезни - "код надо писать так, чтоб через 349 лет снурфики с альфа-центавра могли применить это гениальный творение для управления гравиципами подав на вход не 7 а 4". Не с адресом здесь универсальность, это кастом. Здесь универсальность это enum_status для ai и struct_ai. В это легко приводятся ai {8A, 2A, 8AC, 2AC, ПЛК63/73/150/154/160} и сам подход к работе с структурами.

Но мне без разницы кто что и как делает

Cs-Cs
17.08.2023, 14:40
Сначала я тоже так думал. После подумал и решил что at% 1 (один) раз - норм.
-код чище : Slave.чтото vs PSlave^.чтото
-код быстрее : Slave.чтото - прямое обращение, PSlave^.чтото - предварительное обращение к PSlave
Да, чёрт побери, ты прав! Это красивее и логичнее! Я попробую сделать первый проект так, как начал, а потом, если это будет повторяться - подумаю и перейду на прямые адреса.
Я ещё не переболел универсальностью. Может, под самую старость доболею. Хз! =)

capzap
17.08.2023, 14:45
-код чище : Slave.чтото vs PSlave^.чтото
-код быстрее : Slave.чтото - прямое обращение, PSlave^.чтото - предварительное обращение к PSlave
вот уж совершенно не факт, если кто то работает дальше со всеми переменными структуры через указатель да еще и в одной портянке, то наверное дольше, а если указатель передать в функцию, которая и обрабатывает логический блок на основе данных, то в объявлении тип данных структура и нет ни каких галочек

Валенок
17.08.2023, 17:47
.. и перейду на прямые адреса..
прямой адрес (1 штука)
Прямые адреса в общем случае - зло. Исключения редки. Это тот редкий случай.

Валенок
17.08.2023, 18:34
а если указатель передать в функцию...
Вот например :

SysMemCmp(adr(Slave), ...)
vs
SysMemCmp(PSlave, ...)

Редкий случай когда 1-й вариант длинее в написании. Исполнении самой функции - одинаково. Но :
1. Когда-то вы выполнили хотя бы 1 раз инициализацию PSlave
2. Постоянно проверяете какой-то флажок init
3. И-и-и ... 1-й вариант все равно быстрее в вызове )) Аdr - это не совсем функция. Имя и есть адрес. Константный адрес. А к памяти по адресу "PSlave" еще нужно обратится что оттуда достать адрес для передачи))

--
И да. В кач-ве рыбки под темное:
Под указателем Вы не поменяете данные ручками ))

senkos
18.08.2023, 15:16
Двумя скрепками соедините A1-A2, B1-B2
Сделайте по одному RS пяток одинаковых слейвов с разными адресами, по другому RS мастера и опрашивайте слейвы, руками пробуйте - все вопросы снимутся.

Пробую понять азы на простом примере без использования циклов. Соединил проводами RS1 и RS2, соответственно как на скринах сделал Modbas Master с пятью UMD в которых есть String всего с двумя регистрами.
Так же Modbas Slave добавил переменные на каждое устройство. Адреса их 16,17,18,19,20.
Проект прилагаю, таргет от ПЛК110-24-30PM(M02)
Помогите пожалуйста понять и найти в чем я ошибаюсь.69665
69666

kondor3000
18.08.2023, 15:21
Пробую понять азы на простом примере без использования циклов. Соединил проводами RS1 и RS2, соответственно как на скринах сделал Modbas Master с пятью UMD в которых есть String всего с двумя регистрами.
Так же Modbas Slave добавил переменные на каждое устройство. Адреса их 16,17,18,19,20.
Проект прилагаю, таргет от ПЛК110-24-30PM(M02)
Помогите пожалуйста понять и найти в чем я ошибаюсь.
[

Зачем вам 5 слейвов 485-2 ? Вы хоть читали, что тут обсуждалось?
Бедный ПЛК сойдёт с ума от такого)))

Валенок
18.08.2023, 15:48
Да нормуль все. В рамках одного проекта видеть все концы - для тренинга самое то


to senkos
проект, если сами не разберетесь или кто посмотрит, гляну позже. Обычно - настройки

kondor3000
18.08.2023, 15:57
Да нормуль все. В рамках одного проекта видеть все концы - для тренинга самое то

Да не нормуль, он сам написал есть структура compressors AT%QD7.1.0 : ARRAY [1..8] OF COMPRESSOR;, которую надо передать на панель,
структура из 12 регистров * 8 =96 регистров
В слейв добавляем 48 шт 4 байт или 96 шт 2 байт, и всю структуру кладём по адресу первого регистра слейва. Адрес слейва для панели 1.

Вот примерно так, у меня в ПЛК только другие адреса, с начальными значениями в структуре всё видно, если по 2 байт сделать. 69668
Вот в работе по 2 байта, целочисленные видны правильно 69669
По байтам включён 0 бит (1) и 8 бит (256) регистра WORD =257

Валенок
18.08.2023, 15:59
Да суть этого - потренироваться без панели изобразив панель в самом плк
Получится с плк - получится с панелью без вариков))

Из себя же прочитать как из 8АС, в себя же отправить обработанные данные, изобразив панель собой, и в себе же как в панели увидеть что отправили себе из себя. Просто же. Это если панель-слейв.
А если она мастер так и читать из себя как 8ас, и получая в себя, обработать в сразу в слейве.

senkos
18.08.2023, 16:32
Жесть какая, по моему я зря это затеял :)
У меня есть ПЛК, есть модуль ввода, но к нему жду конвертор чтобы сконфигурировать, есть и панель, но не хочу пока ее использовать без четкого понимания основ.
Думал просто соединив два RS и задав на слейвах значения, смогу получить их на Мастере, тем самым эмулировать модули ввода. Каждый слейв это условный модуль ввода как бы (тут я просто указал одну переменную Real)/

senkos
18.08.2023, 16:38
Зачем вам 5 слейвов 485-2 ? Вы хоть читали, что тут обсуждалось?
Бедный ПЛК сойдёт с ума от такого)))

Тут каждый слейв это условный модуль ввода с одной переменной Real. Или не правильно я думаю? Мне то главное понять все движения байтов между RS-ками и ПЛК

kondor3000
18.08.2023, 16:40
Жесть какая, по моему я зря это затеял :)
У меня есть ПЛК, есть модуль ввода, но к нему жду конвертор чтобы сконфигурировать, есть и панель, но не хочу пока ее использовать без четкого понимания основ.
Думал просто соединив два RS и задав на слейвах значения, смогу получить их на Мастере, тем самым эмулировать модули ввода. Каждый слейв это условный модуль ввода как бы (тут я просто указал одну переменную Real)/

Никто не против же))) тренируйтесь, главное, что бы вы понимали, что делаете. Не можете работать с блоком, тренируйтесь между ПЛК и панелью,
передайте пару регистров для начала, потом со стрингом и т. д.

Затея со 5 слейвами, возможна, если вы опять понимаете что к чему, и не будете физически туда что то ещё подключать.

senkos
18.08.2023, 16:50
Затея со 5 слейвами, возможна, если вы опять понимаете что к чему, и не будете физически туда что то подключать.

Я на слейвах хотел просто менять значения modull_1 которые типа Real прямо на компе при отладке.

Валенок
18.08.2023, 18:06
. но к нему жду конвертор чтобы сконфигурировать...
8AC ? Да прям из ПЛК можно законфигурировать ))
---


Регистры с 0 а не с 1
И вот. Немного убрал лишнего (вслепую. плк пока нет.
..
Появился - заместо string везде нужно string(79). И всё.

Cs-Cs
19.08.2023, 09:06
Камрады! Раз уж так совпадает, что вы тут объясняете технологию, которую я ща сам применыю в своём проекте с панелью (у меня ИП320, Мастер) то скажите: при такой тхенологии, когда мы отображаем структуру на адреса Slave через указатели или прямую адресацию, переменные в Slave будут RETAIN?
Я, может, косноязычно пояснил. В общем, если в этой струкетуре для панели будут ещё и всякие настройки проекта - то они будут RETAIN, или нет? Вроде как все Slave-переменные в ПЛК всегда RETAIN...

Валенок
19.08.2023, 09:39
Да. Ретайн не переменные в слейве, а сам слейв

но если что не так пойдёт, это будет не из-за "технологии"

Cs-Cs
19.08.2023, 09:41
Да. Ретайн не переменные в слейве, а сам слейв
но если что не так пойдёт, это будет не из-за "технологии" Ога, спасибо! Тестану на следующей неделе это всё!

capzap
19.08.2023, 10:14
Камрады! Раз уж так совпадает, что вы тут объясняете технологию, которую я ща сам применыю в своём проекте с панелью (у меня ИП320, Мастер) то скажите: при такой тхенологии, когда мы отображаем структуру на адреса Slave через указатели или прямую адресацию, переменные в Slave будут RETAIN?
Я, может, косноязычно пояснил. В общем, если в этой струкетуре для панели будут ещё и всякие настройки проекта - то они будут RETAIN, или нет? Вроде как все Slave-переменные в ПЛК всегда RETAIN...

панель надо по особенному включать, чтоб ретайн в плк начал работать, лучше чтоб она слейвом была

Cs-Cs
19.08.2023, 10:35
Мда. Гуру форма хреновы. Я зол: никто ничего не пояснил, а только запутали.
Чё делать-то, чтобы всё из панели было RETAIN? Какую документацию про это почитать

Cs-Cs
19.08.2023, 11:34
Короче, я тестану всё сам тогда. Сорян, но из-за доли недосказанности (которая типа как указывает на профессионализм) и косноязычности я не понимаю.

kondor3000
19.08.2023, 12:35
Чё делать-то, чтобы всё из панели было RETAIN? Какую документацию про это почитать

Ничего особо делать не надо, главное, чтобы программа при запуске и панель ИП320 не переписывала нужные регистры, всё!69677
Сделал тест уже, регистры 0 и 1 целочисленные и 2-3 Float сохранили значения, 4 регистр это управление экранами ( сбрасывается сам в 0), 5 регистр - панель передаёт номер текущего экрана ( регистры можно назначить).
Первый раз надо забить уставки ручками ( или сделать инициализацию в ПЛК), панель позволяет записать в регистры уставки, но только по кнопке на панели.

melky
19.08.2023, 12:44
Использовал ИП320 как мастер для ПЛК150, 154. Настройка переменных через конфигурацию (всегда ретейн).

Я не знаю, что там надо включать по особому?????? эта панель же тупая, не имеет скриптов и прочего, что прочитала из регистров, то и показывает, что запишешь, то ПЛК и запомнит.
Да, с записью там возился, так как запись была или с панели или по SNMP (стоял шлюз)

у меня была старая панель, где COM имеет 3-й контакт для записи в панель. В новой панели что-то по части сохранения в ней данных изменилось????

kondor3000
19.08.2023, 18:15
Проверил на 2 ПЛК, один Мастер читает 7 модулей, 69682
второй эмулятор 7 шт. слейвов модулей МВ110-8АС 69683
Всё работает.

kondor3000
19.08.2023, 18:35
Не совсем понял - зачем 2-й ПЛК. Оба 100/150/154 ? Ну работает - и ок.
А "2 byte" зачем юзали ? Чтоб было в 2 раза больше строк в слейве )) ?

ПЛК 154, с одним 485, а 2 байт были уже набиты, переделывать лень)))

Newcomer
22.08.2023, 16:09
Добрый день

Какое максимальное количество FB может быть в проекте ?

kondor3000
22.08.2023, 16:30
Добрый день

Какое максимальное количество FB может быть в проекте ?

Точно не скажу, несколько сотен точно, добавление одной биб-ки Oscat 333, добавляет сотню ФБ.

Евгений Кислов
22.08.2023, 18:44
Добрый день

Какое максимальное количество FB может быть в проекте ?

Cм. скриншот.

69725

senkos
23.08.2023, 16:59
Доброго дня всем! Благодарю всех за прошлые ответы, у меня все заработало, подключил датчики к МВ и в программе получаю данные, дальше буду работать над отправкой их на панель.

Назрел новый вопрос: есть ПЛК110, устройство работает совместно с ИП320, но нет файлов ни плк ни панели, а панель нужно заменить, так как выцвел полностью экран. Как можно решить это? Возможно ли как то выцепить на какие регистры плк отправляет данные в панель, чтобы новую панель сконфигурировать?

kondor3000
23.08.2023, 17:32
Доброго дня всем! Благодарю всех за прошлые ответы, у меня все заработало, подключил датчики к МВ и в программе получаю данные, дальше вуду работать над отправкой их на панель.

Назрел новый вопрос: есть ПЛК110, устройство работает совместно с ИП320, но нет файлов ни плк ни панели, а панель нужно заменить, так как выцвел полностью экран. Как можно решить это? Возможно ли как то выцепить на какие регистры плк отправляет данные в панель, чтобы новую панель сконфигурировать?

Если нет проектов, проще написать их заново.
А вообще сниффером это делается, смотрите обмен и какие регистры отправляются. Пишите проект к панели.
Только всё равно у вас не будет проекта ПЛК. Потом и к ПЛК программу переписывать.

Cs-Cs
23.08.2023, 21:17
А если заменить экран в панели? Ну, вскрыть её и переставить его?

kondor3000
23.08.2023, 21:57
Кстати да, проще плату переставить в новую панель, там даже чтобы батарейку заменить, надо плату снимать. 2 мин на всё.

Habib_1
24.08.2023, 05:12
Здравствуйте!
Начал рассматривать пример программ для ПЛК 1хх (с сайта). Запускаю программу №4 (Задание ШИМ на выходе ПЛК) и на выходе ПИД 0 (все в режиме эмуляции).
Входные данные ввожу, но на выходе все равно 0. Есть кто рассмотрел данный пример?

1exan
24.08.2023, 05:22
Здравствуйте!
Начал рассматривать пример программ для ПЛК 1хх (с сайта). Запускаю программу №4 (Задание ШИМ на выходе ПЛК) и на выходе ПИД 0 (все в режиме эмуляции).
Входные данные ввожу, но на выходе все равно 0. Есть кто рассмотрел данный пример?

Ну выложите сюда то, что тестируете, так быстрее будет.
Если там используются для пид библиотеки овена, то они не поддерживают эмуляцию (их реализация - в ПЛК)

Habib_1
24.08.2023, 07:59
Если там используются для пид библиотеки овена, то они не поддерживают эмуляцию (их реализация - в ПЛК)

Да там библиотека PID_regulators. Спасибо, думаю с контроллером пробовать буду.

senkos
24.08.2023, 09:33
Здравствуйте!
Если я к RS-485, который соединяет ПЛК и МВ, подключаюсь параллельно преобразователем интерфейса USB/RS485, чтобы прослушать порт, то данные в этом порту идут, но в codesys уже не поступают на переменные.
Так и должно быть?
Данные идут на прослушке такого типа:
3a 31 35 30 33 30 31 31 38 30 30 32 38 41 37 0d0a
3a 31 36 30 33 30 31 31 38 30 30 32 38 41 36 0d0a
3a 31 30 30 33 30 31 31 38 30 30 32 38 41 43 0d0a

что то не похоже на modbus rtu?

capzap
24.08.2023, 09:55
Здравствуйте!
Если я к RS-485, который соединяет ПЛК и МВ, подключаюсь параллельно преобразователем интерфейса USB/RS485, чтобы прослушать порт, то данные в этом порту идут, но в codesys уже не поступают на переменные.
Так и должно быть?
Данные идут на прослушке такого типа:
3a 31 35 30 33 30 31 31 38 30 30 32 38 41 37 0d0a
3a 31 36 30 33 30 31 31 38 30 30 32 38 41 36 0d0a
3a 31 30 30 33 30 31 31 38 30 30 32 38 41 43 0d0a

что то не похоже на modbus rtu?
если Вы включились в сеть как мастер то конечно другой мастер может перестать получать данные
а по поводу посылок это ascii , вот описание например MODBUS Message ASCII framing (https://ozeki.hu/p_5855-modbus-ascii.html)

senkos
24.08.2023, 11:00
по поводу посылок это ascii , вот описание например MODBUS Message ASCII framing (https://ozeki.hu/p_5855-modbus-ascii.html)

Круто, спасибо! И точно у меня ASCII был выставлен в настройках RS485.
Теперь такие красивые читаемые пакеты шлет:
00:00:00.717 - Request: 16 03 01 18 00 28 c7 08
00:00:00.717 - ID: 22, Fn: 3 (Read HR), addr: 280, count: 40, CRC: 0x8c7

00:00:00.868 - Request: 10 03 01 18 00 28 c7 6e
00:00:00.868 - ID: 16, Fn: 3 (Read HR), addr: 280, count: 40, CRC: 0x6ec7

00:00:01.032 - Request: 11 03 01 18 00 28 c6 bf
00:00:01.032 - ID: 17, Fn: 3 (Read HR), addr: 280, count: 40, CRC: 0xbfc6

senkos
24.08.2023, 21:57
Для панели мастер можно создать в слейве, аналог массива ARRAY [0..7] OF COMPRESSOR; и отправить масссивом всё. 2 BYTE тоже лучше объединить.
У панели мастера есть недостаток, хоть один регистр с неверным адресом, будет сильно тормозить.

Решил панель сделать Мастером.
В конфигурации ПЛК воссоздал образ структуры COMPRESSOR по каждому компрессору свои переменные.
На скрине отражается это: 69770

Если все правильно я понял, то у меня возникли сложности:
1) Как в панели из первого WORDа получить биты, в них будут передаваться с ПЛК в панель алармы и статусы. Или же так и прописать их отдельными переменными в структуре и в конфигурации ПЛК, по 8шт WORD на каждый компрессор.
2) Каким образом мне присвоить выходам значения члена массива COMPRESSORS[k]?

Вручную присвоить каждому выходу свое значение это наверное не вариант?

kondor3000
24.08.2023, 22:14
Решил панель сделать Мастером.
В конфигурации ПЛК воссоздал образ структуры COMPRESSOR по каждому компрессору свои переменные.
На скрине отражается это.
Если все правильно я понял, то у меня возникли сложности:
1) Как в панели из первого WORDа получить биты, в них будут передаваться с ПЛК в панель алармы и статусы.
2) Каким образом мне присвоить выходам значения члена массива COMPRESSORS[k]?69770

Вручную присвоить каждому выходу свое значение это наверное не вариант?

Вы не совсем правильно поняли, в структуре вы можете оставить байты ( у меня на скрине с байтами), а можно сделать маску WORD.
Упаковка и распаковка в программе ПЛК через точку, только в байте 8 бит, а в регистре 16 бит
например упаковка Mask.0:=b0; Mask.1:=b1; Mask.2:=b3; и т. д. или распаковка b0:=Mask.0; b1:=Mask.1; b2:=Mask.2; и т. д.

А вот в панели нет байт, соответственно обращение ко всем 16 битам будет в одном WORD, например 4х0 бит 0, 4х0 бит 1 ...... 4х0 бит 15

С байтами в ПЛК, у вас получится, 1 байт - биты с 0 по7 и 2 байт - биты с 0 по 7, а в панели регистр с битами с 0 по 15
Чтобы не путаться и написал сделайте WORD, например упаковали бит 10 (Mask.10:=b10)
и получили в панели 10 бит (4х0 бит 10)

senkos
24.08.2023, 22:33
Упаковка и распаковка в программе ПЛК через точку, только в байте 8 бит, а в регистре 16 бит
например упаковка Mask.0:=b0; Mask.1:=b1; Mask.2:=b3; и т. д. или распаковка b0:=Mask.0; b1:=Mask.1; b2:=Mask.2; и т. д.


Упаковка и распаковка это про создание WORD из двух BYTE и наоборот?

А каким образом мне присвоить каждому выходу QB7.10 ... QB7.17 значения из COMPRESSORS[1]? Неужели вручную писать %QB7.10 := COMPRESSORS[1].bSignal12;...

То есть как мне проитерировать выходы чтобы в цикле их заполнить?
Или как привязать COMPRESSORS[1..7] OF COMPRESSOR к выходам QB7.xxx

kondor3000
24.08.2023, 23:00
Упаковка и распаковка это про создание WORD из двух BYTE и наоборот?

А каким образом мне присвоить каждому выходу QB7.10 ... QB7.17 значения из COMPRESSORS[1]? Неужели вручную писать %QB7.10 := COMPRESSORS[1].bSignal12;...

То есть как мне проитерировать выходы чтобы в цикле их заполнить?
Или как привязать COMPRESSORS[1..7] OF COMPRESSOR к выходам QB7.xxx

Упаковка и распаковка, как биты положить или вытащить из маски WORD

Зачем это всё, ведь написали уже, делаете в слейве 2 байт 96 штук (или 4 байт - 48 штук) и по кладёте структуру по адресу 0 регистра.69775
В примере есть присвоение регистров из одной структуры в другую, пример упаковки бит в структуру

Адреса в панели для структуры COMPRESSORS[1..7] :
bSignal12:WORD; - адрес 4х 0 (биты - 4х0 бит 0, 4х0 бит 1, 4х0 бит 2 ........ 4х0 бит 15 )
t_1st :INT; - адрес 4х 1
t_2st :INT; - адрес 4х 2
t_oil :INT; - адрес 4х 3
P_1st:REAL; - адрес 4х 4
P_2st:REAL; - адрес 4х 6
P_oil :REAL; - адрес 4х 8
P_water:REAL; - адрес 4х 10 и далее повторяются начиная с 4х 12 ( каждый адрес +12)

senkos
25.08.2023, 00:15
Благодарю Вас! Наконец то я врубился и нашел свою запарку.
Я прописывал compressors AT %QB7.10 : ARRAY[1..7] OF COMPRESSOR; и мне выдавало ошибку не верный адрес, думал значит не катит этот метод присваивания.
то есть %QB а нужно было %QW если все WORDы делать или %QD если все в DWORD, брал адрес подэлемента а не его переменной.

senkos
25.08.2023, 10:13
делаете в слейве 2 байт 96 штук (или 4 байт - 48 штук)

69795
Как вы рассчитали что нужно 48шт по 4BYTE? это 192 байта.
Массив COMPRESSORS[1..7] занимает 168 байт, то есть можно было 42 по 4BYTE создать?

kondor3000
25.08.2023, 10:55
У меня compressors AT%QD14.1.0 : ARRAY [1..8] OF COMPRESSOR; это пример, по которому и считал

Пересчитайте для своего COMPRESSORS[1..7]

senkos
25.08.2023, 11:35
Думаю правильно ли такой подход:
всю логику обработки данных с каждого МВ я прописал внутри CASE и что то мне кажется что на обработку каждого канала не будет хватать времени или этот код внутри будет отработан синхронно и не переключится на опрос следующего МВ пока не завершится код до END_CASE?

IF last_error = 0 THEN
k := DWORD_TO_INT( last_address - 15);
CASE k OF 1..7:
compressors[k].bSignal1 := 0;
IF BIT_OF_BYTE(on_off, (k - 1)) = TRUE THEN (* Если компрессор включен то выполняем считывание и заполнение данными*)
compressors[k].bSignal1 := 1;
FOR i := 1 TO 8 DO (* Записываем данные по 8 каналам МВ*)
all_ai[k].ai[i].status := original_8AC[k].SRD[i];
p := ADR(all_ai[k].ai[i].value);
p^ := 0;
all_ai[k].ai[i].cyclic := 0;

IF original_8AC[k].SRD[i] = 0 THEN (* если статус измерения успешен*)
all_ai[k].ai[i].cyclic := original_8AC[k].Read[i,3];
p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2];

CASE i OF
1 : compressors[k].t_1st := REAL_TO_INT( all_ai[k].ai[i].value );
2 : compressors[k].t_2st := REAL_TO_INT (all_ai[k].ai[i].value );
3 : compressors[k].t_oil := REAL_TO_INT ( all_ai[k].ai[i].value );
4 : compressors[k].P_1st := all_ai[k].ai[i].value;
5 : compressors[k].P_2st := all_ai[k].ai[i].value;
6 : compressors[k].P_oil := all_ai[k].ai[i].value;
7 : compressors[k].P_water := all_ai[k].ai[i].value;
END_CASE;

IF compressors[k].t_1st > ust_T1st THEN
compressors[k].bSignal2.0 := Alarm(k, temp_1st);
END_IF
IF compressors[k].t_2st > ust_T2st THEN
compressors[k].bSignal2.1 := Alarm(k, temp_2st);
END_IF
IF compressors[k].t_oil > ust_Toil THEN
compressors[k].bSignal2.2 := Alarm(k, temp_oil);
END_IF
IF compressors[k].P_1st > ust_P1st THEN
compressors[k].bSignal2.3 := Alarm(k, davl_1st);
END_IF
IF compressors[k].P_2st > ust_P2st THEN
compressors[k].bSignal2.4 := Alarm(k, davl_2st);
END_IF

(* Таймер при включении компрессора от сработки по нижнему давлению масла*)
TON_1( IN := BYTE_TO_BOOL( compressors[k].bSignal1), PT := timer_start );
IF TON_1.Q = TRUE THEN
IF compressors[k].P_oil < ust_Poil_min THEN
compressors[k].bSignal2.5 := Alarm(k, davl_oil_min);
END_IF
END_IF
IF compressors[k].P_oil > ust_Poil_max THEN
compressors[k].bSignal2.5 := Alarm(k, davl_oil_max);
END_IF
IF compressors[k].P_water < ust_Pwater THEN
(* compressors[k].bSignal2.6 := Alarm(k, davl_water) *);
END_IF
END_IF
END_FOR
END_IF
END_CASE
END_IF


last_error := 0;

kondor3000
25.08.2023, 11:56
Думаю правильно ли такой подход:
всю логику обработки данных с каждого МВ я прописал внутри CASE и что то мне кажется что на обработку каждого канала не будет хватать времени или этот код внутри будет отработан синхронно и не переключится на опрос следующего МВ пока не завершится код до END_CASE?


Что такое BIT_OF_BYTE ? Вы хоть на ошибки код проверяйте, компиляция всё показывает


А в эмуляции и проверить код можно.

senkos
25.08.2023, 13:08
Что такое BIT_OF_BYTE ? Вы хоть на ошибки код проверяйте, компиляция всё показывает
А в эмуляции и проверить код можно.

Всегда сначала компилирую и проверяю отсутствие ошибок (F11), ошибок нет в проекте, он работает и считывает все с МВ без эмуляции.

BIT_OF_BYTE - это функция проверки в байте определенного бита.

Не могу понять почему при запуске до нажатия Start в compressors[k].bSignal2 = 32 (должно же быть все 0 по битам), или это Retain уже переменная и ее нужно как то при запуске сбрасывать?

kondor3000
25.08.2023, 13:35
Не могу понять почему при запуске до нажатия Start в compressors[k].bSignal2 = 32 (должно же быть все 0 по битам), или это Retain уже переменная и ее нужно как то при запуске сбрасывать?

Просто нажмите сброс перед Стартом.
Не на то вы смотрите, у вас при старте, неверный индекс массива. Зря вы CASE i OF вложили в цикл FOR
Это надо было отдельно делать.

senkos
25.08.2023, 14:06
Просто нажмите сброс перед Стартом.
Не на то вы смотрите, у вас при старте, неверный индекс массива. Зря вы CASE i OF вложили в цикл FOR
Это надо было отдельно делать.

Простите, но тут задается же изначально 1 (16-15)

k := DWORD_TO_INT( last_address - 15);
CASE k OF 1..7:

или вы про другой индекс?

senkos
25.08.2023, 15:08
Я же написал, Зря вы CASE i OF вложили в цикл FOR. Это надо было отдельно делать.
И вкладывать надо наоборот

удалил вообще весь код, нет ничего :confused:
Запускаю, нажимаю Сброс и все так же compressors[1].bSignal2 = 32 и по датчикам так же хранятся данные с прошлых измерений в compressors[1].t_1st = 22 и по давлению тоже есть значение.
Какой то шайтан, откуда приходит эта единичка в пятом бите bSignal2.
И в 4BYTE выходах тоже есть данные, они по ходу и влияют, но откуда они там берутся
69810

kondor3000
25.08.2023, 15:31
удалил вообще весь код, нет ничего :confused:
Запускаю, нажимаю Сброс и все так же compressors[1].bSignal2 = 32 и по датчикам так же хранятся данные с прошлых измерений в compressors[1].t_1st = 22 и по давлению тоже есть значение.
Какой то шайтан, откуда приходит эта единичка в пятом бите bSignal2.
И в 4BYTE выходах тоже есть данные, они по ходу и влияют, но откуда они там берутся


Возможно выравнивание работает, все 32 битные переменные должны быть с чётными адресами.
Кстати заработал ваш проект, я же в эмуляции запускаю, а не на контроллере.

Короче у меня не выравнивание, а присвоение переменных в программе было больше Уставок =8, поэтому 5 бит и включался.
В структуре struct_original_8AC было присвоение 17 и 27 в REAL

senkos
25.08.2023, 16:54
Возможно выравнивание работает, все 32 битные переменные должны быть с чётными адресами.
Кстати заработал ваш проект, я же в эмуляции запускаю, а не на контроллере.

Короче у меня не выравнивание, а присвоение переменных в программе было больше Уставок =8, поэтому 5 бит и включался.
В структуре struct_original_8AC было присвоение 17 и 27 в REAL

Сейчас удалил все присвоенные значения на уставках. Удалил весь код в исполнении, запускаю и уставки на своих местах и по моему никакого сдвига, так как все значения в нужных переменных.
В %QD7.10.0 так же какое то значение присутствует. Уже не понимаю что делать, вроде все DWORD и REAL на четных адресах, наверное возьму выходной до понедельника ))
Выравнивание где то отключается?
69819

kondor3000
25.08.2023, 17:30
Сейчас удалил все присвоенные значения на уставках. Удалил весь код в исполнении, запускаю и уставки на своих местах и по моему никакого сдвига, так как все значения в нужных переменных.
В %QD7.10.0 так же какое то значение присутствует. Уже не понимаю что делать, вроде все DWORD и REAL на четных адресах, наверное возьму выходной до понедельника ))
Выравнивание где то отключается?

Дело не в выравнивании, если вставили, то удалите вторую Запасную переменную,

Нашёл причину, если убрать эту строку, то в динамике будет включаться 5 бит 69825

5 бит включается в программе, если переменная меньше уставки или больше, а причина этого в сравнении с уставками,
У вас там стоит таймер, только END_IF стоит не там где надо, он работает на < Уставки, а на > уставки, не работает,
перенёс END_IF ниже и всё заработало как надо, теперь и эту строку можно убрать.

senkos
25.08.2023, 22:07
5 бит включается в программе, если переменная меньше уставки или больше, а причина этого в сравнении с уставками,
У вас там стоит таймер, только END_IF стоит не там где надо, он работает на < Уставки, а на > уставки, не работает,
перенёс END_IF ниже и всё заработало как надо, теперь и эту строку можно убрать.

Таймер специально поставлен на < уставку, так как по технологии при включении компрессора давление масла меньше минимальной уставки и это приведет к моментальному выключению по аларму. Таймер позволяет например 20 секунд игнорировать нижнюю уставку пока давление масла в картере не поднимется выше минимальной уставки до рабочего значения которое между мин и макс уставками. Потом таймер становится TRUE и если по неисправности давление не поднялось то компрессор аварийно останавливается по условию.
Верхнее давление масла в запуске не участвует поэтому и не нужен ему таймер.

Почитал в мануалах codesys про сброс в программе и он равносилен отключению питания плк, что я постоянно делал.

kondor3000
25.08.2023, 23:17
Таймер специально поставлен на < уставку, так как по технологии при включении компрессора давление масла меньше минимальной уставки и это приведет к моментальному выключению по аларму. Таймер позволяет например 20 секунд игнорировать нижнюю уставку пока давление масла в картере не поднимется выше минимальной уставки до рабочего значения которое между мин и макс уставками. Потом таймер становится TRUE и если по неисправности давление не поднялось то компрессор аварийно останавливается по условию.
Верхнее давление масла в запуске не участвует поэтому и не нужен ему таймер.


5 бит у вас срабатывает при пуске программы где меньше, (compressors[k].P_oil < ust_Poil_min ), после отсчёта таймера, если давление равно 0 . А оно равно нулю без подачи начальных значений.
Поэтому и висит у вас 32 постоянно.

Вот программа для эмуляции, 1 компрессор автоматически запускается с установкой начальных значений. Можете протестировать.
В original_8AC[1].READ можно менять значения и смотреть срабатывание аварий в compressors[1].bSignal2

senkos
28.08.2023, 09:06
5 бит у вас срабатывает при пуске программы где меньше, (compressors[k].P_oil < ust_Poil_min ), после отсчёта таймера, если давление равно 0 . А оно равно нулю без подачи начальных значений.
Поэтому и висит у вас 32 постоянно.

Вот программа для эмуляции, 1 компрессор автоматически запускается с установкой начальных значений. Можете протестировать.
В original_8AC[1].READ можно менять значения и смотреть срабатывание аварий в compressors[1].bSignal2

Спасибо огромное что настолько вникли в проект! Нашел свои проблемы в том что я не делал сброс в программе, думал что выключение ПЛК везде все сбрасывает. оказывается когда в Codesys запускаешь проект нужно в нем же и обнулять начальные значения. Все теперь работает как часики.

Нарисовалась новая задача с этим таймером:
1) Например включили компрессор и сразу выключили, таймер TON_1 запустился, но он не имеет опции сброса и отключения отсчета и в итоге мы получим Аларм по двум датчикам на "<". Тут или написать свой таймер со сбросом или модифицировать TON.
2) Компрессоров 7шт выходит нужно для каждого компрессора свой таймер создать. Интересно массив из TON будет содержать различные экземпляры TON?

kondor3000
28.08.2023, 09:24
Спасибо огромное что настолько вникли в проект! Нашел свои проблемы в том что я не делал сброс в программе, думал что выключение ПЛК везде все сбрасывает. оказывается когда в Codesys запускаешь проект нужно в нем же и обнулять начальные значения. Все теперь работает как часики.

Нарисовалась новая задача с этим таймером:
1) Например включили компрессор и сразу выключили, таймер TON_1 запустился, но он не имеет опции сброса и отключения отсчета и в итоге мы получим Аларм по двум датчикам на "<". Тут или написать свой таймер со сбросом или модифицировать TON.
2) Компрессоров 7шт выходит нужно для каждого компрессора свой таймер создать. Интересно массив из TON будет содержать различные экземпляры TON?

Можно не писать ничего, чтобы сбросить таймер, надо не только обнулить бит на входе, но и сбросить PT:=T#0ms; однократно.

Не надо 7 таймеров, если все 7 шт включаться за 1 минуту, у меня уже всё на 7 компрессорах работает, не меняя почти ничего в программе эмуляции. Вернул только all_ai : ARRAY[1..7,1..8] OF struct_ai; и подправил код. Если надо по другому, то тогда надо 7 шт. TON_: ARRAY [1..7] OF TON;

compressors[k].bSignal1 := 1 ; Единицу заменил на on_off. Всё работает в динамике.

1exan
28.08.2023, 09:33
Можно не писать ничего, чтобы сбросить таймер, надо не только обнулить бит на входе, но и сбросить PT:=T#0ms; однократно.


На самом деле для TON достаточно сбросить вход.
А вот для TOF - необходимо уставку времени обнулять

senkos
28.08.2023, 13:09
Можно в этой ветке продолжить тему проекта компрессорной станции МВ-ПЛК-СП307 чтобы не разрывать целостность обсуждения?
Залил проект в СП307, пока без подключения к ПЛК, что то очень жутко тормозит отклик нажатий на кнопки. Оставляю даже один параметр и все равно тормозит. Убираю все элементы ссылающиеся на PLC порт то переход между экранами происходит моментально. Это панель пытается искать слейв устройство и получить данные?
Кабеля пока нет чтобы подключиться к ПЛК.

Коллеги, спаял провод и все заработало с первого раза. Не тормозит, данные считывает корректно, уставки срабатывают, ошибки сигнализируются. Всем огромное спасибо!
Теперь буду мелочевкой заниматься в плане отображения статистики и тп.

Проект к СП307 прилагаю:

vitalij
04.09.2023, 08:00
здравствуйте. стоит задача опрашивать контроллер 160 с нескольких мастеров. в конфигурации котнроллера добавлен slave tcp с портом 502. если добавить второй slave TCP в конфигурации ,то какой порт ему необходимо назначить? какой список диапазонов разрешенных портов?

EFrol
04.09.2023, 08:07
По идее можно такой же. ТСР соединение должно образовывать сессию для каждого подключения. У меня на ПЛК110 создано 6 502-х портов. Работает!!!

vitalij
04.09.2023, 08:09
По идее можно такой же. ТСР соединение должно образовывать сессию для каждого подключения. У меня на ПЛК110 создано 6 502-х портов. Работает!!!

спасибо. попробую

Gatling
05.09.2023, 11:38
Здравствуйте. Первый раз сел за кодесис 2.3, до этого работал на 3.5. Возникли некоторые трудности, в основном пишу программы простенькие на FBD, но так как в кодесисе 2.3 на фбд нельзя нормально использовать блок MOVE с EN/ENO приходится использовать язык LD. Вопрос следующий, в конце цепи я могу использовать блок мув с ен/ено, но у меня условия такие, если переменная "шаг" = 0 или 4, то мы пишем через мув определенную инфу. На FBD ты просто взял блок EQ и вот твое сравнение переменной с нужной цифрой, а в LD он мне дает вытянуть EQ только в конце цепи, а в конце у меня должен быть MOVE, как
это все дело написать на LD? То есть условия такие: Если переменная шаг = 0 или 4, и вар1 и вар2 =1 то мы мувим какое-то число в переменную. Надеюсь смог изложить понятно мысль.

petera
05.09.2023, 12:09
....На FBD ты просто взял блок EQ и вот твое сравнение переменной с нужной цифрой, а в LD он мне дает вытянуть EQ только в конце цепи, а в конце у меня должен быть MOVE, как это все дело написать на LD? То есть условия такие: Если переменная шаг = 0 или 4, и вар1 и вар2 =1 то мы мувим какое-то число в переменную. Надеюсь смог изложить понятно мысль.

LD - контакты + катушки, в чем проблема?
70022

ЗЫ.
на счет
в кодесисе 2.3 на фбд нельзя нормально использовать блок MOVE с EN/ENO
https://owen.ru/forum/attachment.php?attachmentid=32403&d=1501764156

Gatling
05.09.2023, 12:31
LD - контакты + катушки, в чем проблема?
70022

ЗЫ.
на счет
https://owen.ru/forum/attachment.php?attachmentid=32403&d=1501764156

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

А по поводу блока MOVE с EN/ENO на FBD, то в справке указано, что на FBD его нельзя использовать с EN/ENO в 2.3, в 3.5 я свободно использовал это.

kondor3000
05.09.2023, 15:45
В этом случае приходится использовать промежуточные переменные, но, увы, придется видимо делать так.

А по поводу блока MOVE с EN/ENO на FBD, то в справке указано, что на FBD его нельзя использовать с EN/ENO в 2.3, в 3.5 я свободно использовал это.

Пишите на CFC, там всё можно и в любом месте, а ещё лучше изучайте ST.

Artem2928a
06.09.2023, 09:58
Добрый день, кодесис 2.3 , при попытке проверить схему выдает ошибку про нелегальные адреса, вместо true и false стоят вопросительные знаки, в чем может быть проблема?
70057

1exan
06.09.2023, 10:12
Подождите, сейчас кто-нибудь достанет хрустальный шар, и посмотрит что вы там написали и какая была ошибка

capzap
06.09.2023, 10:20
Добрый день, кодесис 2.3 , при попытке проверить схему выдает ошибку про нелегальные адреса, вместо true и false стоят вопросительные знаки, в чем может быть проблема?
70057

потому что открыли ФБ а не его экземпляр.

И как дополнение нет основной программы, которая работает в цикле и запускает остальные ПОУ

kondor3000
06.09.2023, 10:30
Добрый день, кодесис 2.3 , при попытке проверить схему выдает ошибку про нелегальные адреса, вместо true и false стоят вопросительные знаки, в чем может быть проблема?
70057

Похоже вам сначала надо просмотреть обучающие видео, их 10 -15 шт всего, коротеньких https://www.youtube.com/watch?v=hm_om_-8ins&list=PL144mKGdm0ZNy5g-ujn245KJLrcybuJ64&index=1

Cs-Cs
06.09.2023, 13:00
Ещё можно:
1. Проект запустить на исполнение (F5)
2. Если были раные опыты - в меню "Проект" выбрать пункт "Очистить всё" и загрузить проект в ПЛК заново.

capzap Ээээ.. так у него она называется PLC_PRG, а она запускается автоматически. А FB у него на скриншоте нет.

capzap
06.09.2023, 13:46
capzap Ээээ.. так у него она называется PLC_PRG, а она запускается автоматически. А FB у него на скриншоте нет.

да ладно, знаете где смотреть FB это или PRG ?

Cs-Cs
06.09.2023, 14:07
да ладно, знаете где смотреть FB это или PRG ? А как это тогда у него должно работать?

1exan
06.09.2023, 17:10
А как это тогда у него должно работать?

Наверное такого варианта даже разработчики кодесиса не смогли предвидеть

kondor3000
06.09.2023, 17:37
Добрый день, кодесис 2.3 , при попытке проверить схему выдает ошибку про нелегальные адреса, вместо true и false стоят вопросительные знаки, в чем может быть проблема?
70057

Просто PLC_PRG - это основная программа, её не рекомендуется переименовывать.
У вас вместо программы PLC_PRG стоит ФБ (функциональный блок с именем PLC_PRG ), поэтому и не работает и вопросы стоят. ФБ надо объявлять в программе и вызывать, выше написали.

Makc
08.09.2023, 06:07
Есть вопрос по скриптам, хочу сделать опрос счетчиков ЭЭ СЕ303 энергомеры, есть какойто отладчик LUA в MasterOPCserver?

TheAid
08.09.2023, 14:45
здравствуйте, что нужно дописать в код чтобы сделать чтобы при нажатии кнопки у меня был бесконечный цикл, то есть включался и выключался.
PROGRAM PLC_PRG
VAR
KNOPKA1:BOOL;
TIMER: TON;
TIMERTOF: TOF;
END_VAR



KNOPKA1:= DI5;
TIMER(IN:=KNOPKA1 , PT:= T#1s, Q=>DO0 , ET=> );
TIMERTOF(IN:=TIMER.Q , PT:=T#1s, Q=>DO0 , ET=> );

Cs-Cs
08.09.2023, 14:57
TheAid Надо из библиотеки Util взять готовый тамер BLINK - мигалку.

petera
08.09.2023, 15:09
здравствуйте, что нужно дописать в код чтобы сделать чтобы при нажатии кнопки у меня был бесконечный цикл, то есть включался и выключался.
PROGRAM PLC_PRG
VAR
KNOPKA1:BOOL;
TIMER: TON;
TIMERTOF: TOF;
END_VAR



KNOPKA1:= DI5;
TIMER(IN:=KNOPKA1 , PT:= T#1s, Q=>DO0 , ET=> );
TIMERTOF(IN:=TIMER.Q , PT:=T#1s, Q=>DO0 , ET=> );

KNOPKA1:= DI5;
TIMER(IN:=KNOPKA1 AND NOT TIMERTOF.Q , PT:= T#1s );
TIMERTOF(IN:=TIMER.Q , PT:=T#1s, Q=>DO0 );

kondor3000
08.09.2023, 15:11
здравствуйте, что нужно дописать в код чтобы сделать чтобы при нажатии кнопки у меня был бесконечный цикл, то есть включался и выключался.
PROGRAM PLC_PRG
VAR
KNOPKA1:BOOL;
TIMER: TON;
TIMERTOF: TOF;
END_VAR
KNOPKA1:= DI5;
TIMER(IN:=KNOPKA1 , PT:= T#1s, Q=>DO0 , ET=> );
TIMERTOF(IN:=TIMER.Q , PT:=T#1s, Q=>DO0 , ET=> );



KNOPKA1:= DI5;
TIMER(IN:=KNOPKA1 AND NOT TIMERTOF.Q , PT:= T#1s, Q=>DO0 , ET=> ); // Дописать AND NOT TIMERTOF.Q
TIMERTOF(IN:=TIMER.Q , PT:=T#1s, Q=>DO0 , ET=> );

EFrol
08.09.2023, 15:20
Может лучше использовать BLINK?



PrevDI5 : BOOL;
TMR : BLINK;

IF NOT PrevDI5 AND DI5 THEN // При каждом нажатии
KNOPKA1 := NOT KNOPKA1; // Переключаем кнопку (кнопка с фиксацией)
END_IF
PrevDI5 := DI5;

TMR(ENABLE := KNOPKA1, TIMELOW := T#1s, TIMEHIGH := T#1s); // Сигнал снимаем с TMR.QUT

Makc
12.09.2023, 07:09
В Lua встроенном в ModBus MasterOPC, есть аналог функции vba << Chr>> ?
Возвращает значение типа String, которое содержит символ, связанный с указанным кодом символа.
пример на vba : MyChar = Chr(65) ' Returns A.

Makc
12.09.2023, 09:57
Ребят дайте пожалуйста ссылку на доку LUA реализованном в MasterOPC

capzap
12.09.2023, 10:03
Ребят дайте пожалуйста ссылку на доку LUA реализованном в MasterOPC

https://support.mps-soft.ru/ModbusHelpRus/1_vvedenie.html

обратите внимание в каком разделе Вы задаете сей вопрос

solarize
14.09.2023, 12:17
Здравствуйте. Помогите люди добрые. Столкнулся с такой проблемой.Вкратце. Имеются два ПЛК 150-220.А-М. Один подключен к панели(рабочий плк) СП270 и выполняет свои функции. Все как надо. Другой в резерве. Так вот в эти ПЛК загружен один и тот же проект написанный в codesys v2.3. С первым контроллером(рабочим) все замечательно и при подключению через кабель КС1 к компьютеру программа ведет себя как надо, но вот другой, резервный контроллер, прибыв с поверки отказывается корректно работать. При включении программы и установкой связи с контроллером появляется окно с сообщением #2000:2000.1.1 19:41:1 # 1 PLC STARTED. Не знаю ошибка ли это или все так и должно быть, но после нажатия на "ОК" никаких ошибок не появляется(вроде).Приложу скриншот. Далее что бросается в глаза так это Err=6. Без понятия что это за ошибка, но может знающие люди подскажут, но в случае с первым контроллером(рабочим) этой ошибки нет, тоесть в том же месте пишется Err=0. На втором и третьем скрине показано где именно. Также смущает, что переменная Q=FALSE и как будто бы из-за нее не приходит сигнал на последующие блоки. В "Конфигурации ПЛК" в разделе Statistic постояно горит синим цветом переменная "Power status" и "CPU is overloaded, optimize your programm or increase PLC cycle", хотя на первом ПЛК(рабочим) эти переменные не подсвечиваются(Скрины приложу). Куда копать я уже не знаю. Проект писал не я, поэтому возникают сложности. Надеюсь на хоть какие то наводки. Также, если это что то даст, то первый ПЛК(рабочий) при включении издает характерный щелчок переключения реле, а второй(резерв) нет. Не знаю программно ли это задано или нет. Возможно дело именно в релешке. К сожалению третьего подопытного ПЛК нету, так бы проверил свои догадки на нем. HELP ME PLZ.701857018670187701887018970190
P.S. Также замерил напругу на внутреннем аккумуляторе и оно составило 3,6В. Если пригодятся фотографии поведения программы превого(рабочего) ПЛК с удовольствием предоставлю.

МихаилГл
14.09.2023, 12:25
R_TRIG выдает TRUE один раз за работу одного цикла, далее там FALSE

Приложили б программу для начала, а то вы смотрите различия, а скорее надо смотреть все настройки.

А во вторых ERR это программная штука, а не ошибка контроллера. Если без панели пытаетесь подключиться возможно это ошибка передачи данных с панелью

kondor3000
14.09.2023, 12:50
Здравствуйте. Помогите люди добрые. Столкнулся с такой проблемой.Вкратце.

После заливки программы появляется окно и горят два квадратика в статистике "Power status" и "CPU is overloaded, вот скрин 70191
Запущено внизу справа не активно.

После нажатия в окне ОК, второй квадратик CPU is overloaded тухнет, после этого надо запустить программу Онлайн /Старт .
После этого начинает работать программа. "Power status" должен гореть. И внизу активно - Запущено. 70192

Если второй квадратик так и не потух, значит надо увеличить время цикла. У вас должен быть исходник проекта.
Нажав на ПЛК в конфигурации, выбрать параметры и изменить время цикла например с 1 до 3 или до 5 ms ( иногда и 10 ms )
После изменения цикла надо заново залить проект в ПЛК и создать Загрузочный проект. После нажать Старт.

МихаилГл
14.09.2023, 12:54
Сообщение удалено... Не актуально... Думал автор пишет

МихаилГл
14.09.2023, 13:01
Сообщение удалено... Не актуально...

Юрий В
14.09.2023, 15:23
Хотел спросить, а возможно в ST вставить вычисление логорифмов.

petera
14.09.2023, 15:33
Хотел спросить, а возможно в ST вставить вычисление логорифмов.

В кодесис есть стандартные математические функции LOG() и LN()

Юрий В
14.09.2023, 16:01
Я про Owen Logic, в функциях на ST нет вычисления Log(), или я что-то путаю.

petera
14.09.2023, 16:07
Я про Owen Logic, в функциях на ST нет вычисления Log(), или я что-то путаю.

причем здесь Owen Logic, Вы задаете вопрос в разделе "ПЛК (среда CoDeSys V2.3)"

ЗЫ.
Тут есть логарифмы https://owen.ru/forum/showthread.php?t=37203


function fLn: Real; //Натуральный логарифм
var_input
X:real;
end_var

//PRG
fLn:=0.6931472*fLb(x); //вызов функции "fLb"
end_function


function fLb: Real; //Двоичный логарифм
var_input
X:real;
end_var
var
s:real:=0.0;
a:real:=0.5;
i:udint;
b:real;


end_var

//PRG

if X>0 then
if X>=1 then
b:=1;
X:=X;
else
b:=-1;
X:=1/X;
end_if


if x>2 then
s:=udint_to_real( cd32(real_to_udint(x)));
X:=X/ pow(2,s);
end_if;

for i:=0 to 16 do
x:=x*x;
if x>2 then
x:=x/2;
s:=s+a;
end_if;
a:=a*0.5;
end_for
fLb:=s*b;
end_if

end_function

Если нужен десятичный логарифм, то
Lg(x) = 0.43429 * fLn(x)
или
Lg(x) = 0,30103*fLb(x)

Юрий В
14.09.2023, 16:18
Я про Owen Logic, в функциях на ST нет вычисления Log(), или я что-то путаю.

petera
14.09.2023, 16:22
Я про Owen Logic, в функциях на ST нет вычисления Log(), или я что-то путаю.

Нужны самописные, см. пост выше

Юрий В
14.09.2023, 17:04
Спасибо, Вы мне очень помогли.

solarize
18.09.2023, 06:59
Дело в том что циклы увеличивал и второй квадратик потухал, это верно, но на работающем контроллере при запуски программы Онлайн/Старт "Power Status" и "Cpu is overloaded" не горит и никаких ошибок не возникает. Дело может быть в том что я неправильно загарузил проект в плк. Но делал я это по шаблону "Онлайн/Старт/Создание загрузочного проекта, так же Через "Онлайн/Старт/Создание загрузочного проекта/Загрузка исходных кодов, ну и само собой пробовал через "Онлайн/Записать файл в ПЛК". Добавлю что я чайник в Codesys и многие вещи мне пока не понятны.

solarize
18.09.2023, 07:11
Проект могу отправить, но дело в том что я снимал ПЛК, который "рабочий" и абсолютно те же действия проводил с ним и отключал от панели, но ошибки этой не появлялось. Так же фотографии имеются. Прикреплю так же скрины того же самого со второго не рабочего ПЛК(резервного)70252702537025470255 Хочу обратить внимание на то, что все делалось на одних и тех же условиях, тоесть с отключенной панелью, подключено через КС1 к компьютеру и в одном и том же проекте.
P.s. Запущена программа через "Онлайн/Старт" в обоих случаях.

kondor3000
18.09.2023, 08:17
Проект могу отправить, но дело в том что я снимал ПЛК, который "рабочий" и абсолютно те же действия проводил с ним и отключал от панели, но ошибки этой не появлялось. Так же фотографии имеются. Прикреплю так же скрины того же самого со второго не рабочего ПЛК(резервного) Хочу обратить внимание на то, что все делалось на одних и тех же условиях, тоесть с отключенной панелью, подключено через КС1 к компьютеру и в одном и том же проекте.
P.s. Запущена программа через "Онлайн/Старт" в обоих случаях.

На фото у вас Статистика не работает, потому, что кроме квадратиков, там нули везде (возможно включена эмуляция). А должна быть и температура в ПЛК и время работы и отдыха процессора. При чём цифры постоянно меняются.
Либо нет старта, либо проблемы с ПЛК или программой.
А вот на скрине, статистика работает, но маленький цикл ПЛК, надо увеличить время цикла, тогда потухнет второй квадратик.

Выкладывайте программу.

1exan
18.09.2023, 08:19
Дело в том что циклы увеличивал и второй квадратик потухал, это верно, но на работающем контроллере при запуски программы Онлайн/Старт "Power Status" и "Cpu is overloaded" не горит и никаких ошибок не возникает. Дело может быть в том что я неправильно загарузил проект в плк. Но делал я это по шаблону "Онлайн/Старт/Создание загрузочного проекта, так же Через "Онлайн/Старт/Создание загрузочного проекта/Загрузка исходных кодов, ну и само собой пробовал через "Онлайн/Записать файл в ПЛК". Добавлю что я чайник в Codesys и многие вещи мне пока не понятны.

Для загрузки новой программы надо сделать "Онлайн/Старт/Создание загрузочного проекта", но при этом надо быть подключенным к ПЛК (выполнить Онлайн/Логин).
После выполнения загрузки нужно отключить питание ПЛК на несколько секунд. После подачи питания ПЛК будет использовать обновлённую программу

zavik
19.09.2023, 08:50
Добрый день. Есть ПЛК 160 на котельной, к нему подключен СП310. Система работает. Поручили снимать удаленно с ПЛК показания датчиков. Я подключился к ПЛК, там работает программа управления котлом. Подскажите, с чего начать, что почитать - программировать я умею, но только не ПЛК. Если я начну что-то делать на работающем котле и испорчу - меня расстреляют. Как можно снять данные с датчиков и не нарушить действующую программу?

1exan
19.09.2023, 09:17
Добрый день. Есть ПЛК 160 на котельной, к нему подключен СП310. Система работает. Поручили снимать удаленно с ПЛК показания датчиков. Я подключился к ПЛК, там работает программа управления котлом. Подскажите, с чего начать, что почитать - программировать я умею, но только не ПЛК. Если я начну что-то делать на работающем котле и испорчу - меня расстреляют. Как можно снять данные с датчиков и не нарушить действующую программу?

Что значить снять - на бумажку переписать?

melky
19.09.2023, 09:36
zavik если есть исходники программ то посмотреть что там с сетевыми переменными, каким образом можно подключить связку ПЛК+СП к Scada системе и возможно ли это.

з.ы. раз СП показывает параметры всех датчиков, значит в ПЛК все эти переменные есть - другой вопрос, доступно ли их чтение из системы выше ?

эээ. немного не помню, поищите инфу от petera он с панелями на ТЫ, там были комбинации, когда можно было объединять панели и получать данные через нее. Не знаю, относится это к СП3хх.
+ ПЛК может поддерживать несколько соединений если он является слейвом, но вот будет мешать это работать панели или нет и как там настроена конфигурация или программа кроме вас никто не знает. Ну если вы сами знаете конечно.

zavik
19.09.2023, 10:13
нет. на сколько я понял хотят удаленно смотреть показания датчиков в реальном времени

zavik
19.09.2023, 10:14
zavik если есть исходники программ то посмотреть что там с сетевыми переменными, каким образом можно подключить связку ПЛК+СП к Scada системе и возможно ли это.

з.ы. раз СП показывает параметры всех датчиков, значит в ПЛК все эти переменные есть - другой вопрос, доступно ли их чтение из системы выше ?

эээ. немного не помню, поищите инфу от petera он с панелями на ТЫ, там были комбинации, когда можно было объединять панели и получать данные через нее. Не знаю, относится это к СП3хх.
+ ПЛК может поддерживать несколько соединений если он является слейвом, но вот будет мешать это работать панели или нет и как там настроена конфигурация или программа кроме вас никто не знает. Ну если вы сами знаете конечно.

да и я не знаю - разработчик не отвечает на звонки.

petera
19.09.2023, 10:18
zavik если есть исходники программ то посмотреть что там с сетевыми переменными, каким образом можно подключить связку ПЛК+СП к Scada системе и возможно ли это.

з.ы. раз СП показывает параметры всех датчиков, значит в ПЛК все эти переменные есть - другой вопрос, доступно ли их чтение из системы выше ?

эээ. немного не помню, поищите инфу от petera он с панелями на ТЫ, там были комбинации, когда можно было объединять панели и получать данные через нее. Не знаю, относится это к СП3хх.
+ ПЛК может поддерживать несколько соединений если он является слейвом, но вот будет мешать это работать панели или нет и как там настроена конфигурация или программа кроме вас никто не знает. Ну если вы сами знаете конечно.

В панель лезть не надо.
Если есть исходник программы для ПЛК, то
1. Использовать несколько интерфейсов для одного Modbus Slave (существующий для панели и дополнительный для скада

2. Вставить Modbus Slave для скады в существующий Modbus Slave

Пояснения с картинками здесь https://owen.ru/forum/showthread.php?t=14199&p=146969&viewfull=1#post146969

melky
19.09.2023, 10:21
petera а если нет исходников, как пишет автор? что-то вытянуть можно ?

zavik а что за панель? с Ethernet или без? общение с ПЛК через RS485 или через Ethernet ?

petera
19.09.2023, 10:27
petera а если нет исходников, как пишет автор? что-то вытянуть можно ?

Я думаю, что нет.

ЗЫ.
Если бы разработчик проекта для панели применил финт с копированием всех переменных из ПЛК в промежуточные регистры PSW (некоторые так делают для ускорения обмена панель<--->ПЛК. Одна ф.область с функцией копирования блока данных) и на экранах панели дисплей были привязаны к этим PSW, то у панели с буквой "Р" можно было поискать через порт ethernet осмысленные данные(показания датчиков), а затем через тот же ethernet скаду подключить.

capzap
19.09.2023, 10:29
petera а если нет исходников, как пишет автор? что-то вытянуть можно ?


с чего Вы вообще решили что нет исходников, если он пишет
Я подключился к ПЛК
а слово нет адресовалось не Вам а на фразу
на бумажку переписать

melky
19.09.2023, 10:38
capzap человек не может связаться с разработчиком. А подключиться к ПЛК можно же и без проекта и что-то видеть, нет?

EFrol
19.09.2023, 10:49
Добрый день. Есть ПЛК 160 на котельной, к нему подключен СП310. Система работает. Поручили снимать удаленно с ПЛК показания датчиков. Я подключился к ПЛК, там работает программа управления котлом. Подскажите, с чего начать, что почитать - программировать я умею, но только не ПЛК. Если я начну что-то делать на работающем котле и испорчу - меня расстреляют. Как можно снять данные с датчиков и не нарушить действующую программу?

Первое что пришло в голову - это МКОН (https://owen.ru/product/mkon/example_of_work) в режиме "сниффер" между ПЛК и СП310. Если на панель выводятся данные с этих датчиков, то МКОН их увидит и останется только однозначно их идентифицировать (отношение адрес Modbus + тип значения = значение датчика). Придется повозиться!!!

МихаилГл
19.09.2023, 10:52
capzap человек не может связаться с разработчиком. А подключиться к ПЛК можно же и без проекта и что-то видеть, нет?

Вроде без проекта не подключишься ни к 110, ни к 210

zavik
19.09.2023, 10:53
petera а если нет исходников, как пишет автор? что-то вытянуть можно ?

zavik а что за панель? с Ethernet или без? общение с ПЛК через RS485 или через Ethernet ?

панель СП310 , ПЛК 160 м2
общение через RS485

zavik
19.09.2023, 11:02
Вроде без проекта не подключишься ни к 110, ни к 210

по USB подключился, проект скачал, не хватает только нескольких библиотек.
7028270281

petera
19.09.2023, 11:08
по USB подключился, проект скачал, не хватает только нескольких библиотек.
7028270281

Так иди в конфигурацию ПЛК и сделай п.1. из моего поста https://owen.ru/forum/showthread.php?t=10555&p=416721&viewfull=1#post416721

Ничего от этого в самой программе не поломается, а скаду подключить будет можно.

zavik
19.09.2023, 11:12
спасибо, буду пробовать

capzap
19.09.2023, 11:58
Ничего от этого в самой программе не поломается, а скаду подключить будет можно.

я бы рекомендовал все настройки: уставки, параметры в конфигураторе заскриншотить , потом "лить" по новой чтоб потом не было вопросов а с какими значениями регулятор должен работать

melky
19.09.2023, 12:36
И каких-то библиотек не хватает... с чего бы, если проект залили в ПЛК ?

IVM
19.09.2023, 12:49
И каких-то библиотек не хватает... с чего бы, если проект залили в ПЛК ?

На ПЛК автора темы нет этих библиотек.

solarize
19.09.2023, 14:49
Для загрузки новой программы надо сделать "Онлайн/Старт/Создание загрузочного проекта", но при этом надо быть подключенным к ПЛК (выполнить Онлайн/Логин).
После выполнения загрузки нужно отключить питание ПЛК на несколько секунд. После подачи питания ПЛК будет использовать обновлённую программу

Именно в этом порядке все и делалась. В этом и проблема.

solarize
19.09.2023, 14:50
На фото у вас Статистика не работает, потому, что кроме квадратиков, там нули везде (возможно включена эмуляция). А должна быть и температура в ПЛК и время работы и отдыха процессора. При чём цифры постоянно меняются.
Либо нет старта, либо проблемы с ПЛК или программой.
А вот на скрине, статистика работает, но маленький цикл ПЛК, надо увеличить время цикла, тогда потухнет второй квадратик.

Выкладывайте программу.



На фото как раз таки ПЛК в режиме работы, так как я подключался на прямую во время работы контроллера(контроллер используется для автоматики климат камеры). Никакой эмуляции не было. Все как надо, Онлайн/Логин/Старт. На скрине как раз таки тот самый проблемный контроллер. Напишите почту чтобы я мог отправить проект

kondor3000
19.09.2023, 14:58
На фото как раз таки ПЛК в режиме работы, так как я подключался на прямую во время работы контроллера(контроллер используется для автоматики климат камеры). Никакой эмуляции не было. Все как надо, Онлайн/Логин/Старт. На скрине как раз таки тот самый проблемный контроллер. Напишите почту чтобы я мог отправить проект

Зачем вам почта? Выкладывайте в расширенном режиме, добавить файл. Если не смогу, может кто-то посмотрит.

Cs-Cs
20.09.2023, 00:02
Камрады, подскажите мне простой вопрос. В явном виде в документации не нашёл.
В ПЛК110 адресное простанство едино для ВСЕХ Slave, или разные для разных?
Что будет, если я добавлю в Конфигурацию ПЛК один узел Slave по RS-485 с одним набором регистров, а другой узел - по Ethernet с другим набором регистров?
Вот так, как на картине (сделал для теста): 70298

Почему спрашиваю. Мне по разным интерфейсам надо отдавать разные данные. По RS-485 - для панели оператора, по Ethernet - для системы верхнего уровня.
Как правильно сделать?

petera
20.09.2023, 02:30
Камрады, подскажите мне простой вопрос. В явном виде в документации не нашёл.
В ПЛК110 адресное простанство едино для ВСЕХ Slave, или разные для разных?
Что будет, если я добавлю в Конфигурацию ПЛК один узел Slave по RS-485 с одним набором регистров, а другой узел - по Ethernet с другим набором регистров?
Вот так, как на картине (сделал для теста): 70298

Почему спрашиваю. Мне по разным интерфейсам надо отдавать разные данные. По RS-485 - для панели оператора, по Ethernet - для системы верхнего уровня.
Как правильно сделать?

В Вашем случае для каждого слейва свое адресное пространство.
Общее будет если в ОДНОМ слейве сделать использовать несколко интерфейсов. Частично общее - если один слейв (со своим интерфейсом) вставить в другой слейв.
см. это https://owen.ru/forum/showthread.php?t=14199&p=146969&viewfull=1#post146969

Cs-Cs
20.09.2023, 10:24
petera Большое спасибо! Я нашёл в посте, на который ты ссылаешься, ссылку на документ, который вчера у себя искал и не нашёл!
Мне как раз и надо два разных пространства!

Codesyser
21.09.2023, 08:26
ребятки, подскажите, есть мнение, что на один ПЛК нужно сажать не более 15-20 модулей. Правда ли это? В частности, ПЛК200, модули разнообразные - Di, DO, AI(на езернете), AO(на рс), модулей порядка 80шт. Нужно ли для такого количества модулей соответственно 4-5 ПЛК?

melky
21.09.2023, 08:43
Codesyser у вас распределенная система, чтобы ставить 4-5 ПЛК ?
Сокращайте время опроса за счет периода, быстро масками, ну и в зависимости от процессов и самих модулей. Некоторые модули нет смысла опрашивать в цикле.

1exan
21.09.2023, 09:18
ребятки, подскажите, есть мнение, что на один ПЛК нужно сажать не более 15-20 модулей. Правда ли это? В частности, ПЛК200, модули разнообразные - Di, DO, AI(на езернете), AO(на рс), модулей порядка 80шт. Нужно ли для такого количества модулей соответственно 4-5 ПЛК?

Есть ограничения по размеру файла конфигурации ПЛК (если речь про CDS2.3), а вот про ограничение количества модулей не слышал

In_Da_Cher_A
21.09.2023, 15:37
ребятки, подскажите, есть мнение, что на один ПЛК нужно сажать не более 15-20 модулей. Правда ли это? В частности, ПЛК200, модули разнообразные - Di, DO, AI(на езернете), AO(на рс), модулей порядка 80шт. Нужно ли для такого количества модулей соответственно 4-5 ПЛК?ну сажай 80 на 1 ПЛК. Только мало посадить, надо ещё обработать весь этот карьер сигналов, обычно вот здесь ты и упрёшься, если до этого ещё не заткнётся весь твой опрос.
А запихивание всех этих модулей в более менее что-то работающее, потребует всякого "низкоуровневого" шаманства типа рукопашного опроса через библиотеки масками стрингами и прочими турбонаддувами
вот и выбирай, стоит ли это всё того
или проще распихать это по нормальной структуре с несколькими ПЛК. Как правило, нет таких технологий и участков, где 800+ сигналов непрерывно завязаны между собой, всегд есть что-то первоочередное, есть вспомогательное
а если всё это и так несрочное, то вообще нет смысла экономить на ПЛК
вся эта экономия потом вылезет диким гемором на программировании

МихаилГл
21.09.2023, 21:15
Ну возьмём к примеру обогатительную фабрику... Всего около 200 механизмов, на каждом механизме по 10..20 датчиков (учитывая всё автоматы от силовых до звуковой сигнализации, а также выходные цепи управления) итого 200 х 20 = 4000 дискретов плюс аналоговые линии. И всём этим рулит 1 контроллер.

In_Da_Cher_A
21.09.2023, 22:28
И всём этим рулит 1 контроллер"слабак"(С) если бы это было ПР, было бы чем гордиться

МихаилГл
22.09.2023, 09:24
"слабак"(С) если бы это было ПР, было бы чем гордиться

Не, с пр от такой натуги весь целебный белый дым выйдет

Romashoff
27.09.2023, 08:41
Добрый день случилось следующее, у меня есть действующий объект на плк 73 с использованием модулей расширения МК110 старого образца и я работал с ними по модбас и отправлял в устройство 16-й функцией она же MB_WR_REGS буфер параметров. Теперь вышли обновленные модули МК110 и судя по документации теперь у модулей только 10 функций, получается используя библиотеку ModBus.lib я не могу записывать буфер и мне придется каждый параметр записывать отдельно с помощью 6-й функции MB_WR_SNG_REG правильно я понял ? или есть какое нибудь НО ?
При подключении нового модуля к плк 73 через некоторое время он перезагружается.

kondor3000
27.09.2023, 08:49
Добрый день случилось следующее, у меня есть действующий объект на плк 73 с использованием модулей расширения МК110 старого образца и я работал с ними по модбас и отправлял в устройство 16-й функцией она же MB_WR_REGS буфер параметров. Теперь вышли обновленные модули МК110 и судя по документации теперь у модулей только 10 функций, получается используя библиотеку ModBus.lib я не могу записывать буфер и мне придется каждый параметр записывать отдельно с помощью 6-й функции MB_WR_SNG_REG правильно я понял ? или есть какое нибудь НО ?
При подключении нового модуля к плк 73 через некоторое время он перезагружается.

У вас полная каша в голове. Функция 0х10, это в DEC - 16 функция (запись группы регистров), та что вам и нужна.
А функция 0х06, она и в DEC - 6 функция (запись 1 регистра), она не используется и в старых и новых.

А вот функция 0х0f, в DEC - 15 функция, в старых использовалась, а в новых нет.

дима86
27.09.2023, 09:34
Здравствуйте, подскажите если загружать программу из ПЛК110 при отсутствии исходника при помощи "Открыть проект из ПЛК", а его там не окажется, не слетит ли программа из ПЛК???
70503

kondor3000
27.09.2023, 10:46
Здравствуйте, подскажите если загружать программу из ПЛК110 при отсутствии исходника при помощи "Открыть проект из ПЛК", а его там не окажется, не слетит ли программа из ПЛК???


Не слетит, если не создавать загрузочный проект.

senkos
28.09.2023, 09:24
Здравствуйте, коллеги!
В продолжение проекта Компрессорной станции из 7 компрессоров:
Решил добавить регулировку давления, исполнительный механизм заслонка МЭО будет плавно открывать и закрывать разгрузку общей воздушной магистрали. Решено использовать ПИД регулятор PID_3POS_IM_ANR из PID_Regulators.lib с автонастройкой.

На этапе компоновки всех входящих в ФБ переменных мне не совсем понятна переменная Pv_Time - Circular time (циклическое время).
Каким образом мне его получить?

1exan
28.09.2023, 09:32
Здравствуйте, коллеги!
В продолжение проекта Компрессорной станции из 7 компрессоров:
Решил добавить регулировку давления, исполнительный механизм заслонка МЭО будет плавно открывать и закрывать разгрузку общей воздушной магистрали. Решено использовать ПИД регулятор PID_3POS_IM_ANR из PID_Regulators.lib с автонастройкой.

На этапе компоновки всех входящих в ФБ переменных мне не совсем понятна переменная Pv_Time - Circular time (циклическое время).
Каким образом мне его получить?

Это похоже на период вызова ФБ ПИД - в таком случае можно создать циклическую задачу с фиксированным временем цикла (например, 100мс), добавить в неё вызов программы с ФБ ПИД, а в качестве этой переменной использовать константу (100мс).

senkos
28.09.2023, 09:49
Это похоже на период вызова ФБ ПИД - в таком случае можно создать циклическую задачу с фиксированным временем цикла (например, 100мс), добавить в неё вызов программы с ФБ ПИД, а в качестве этой переменной использовать константу (100мс).

Это нужно создать Task в codesys и из него вызывать ФБ пид регулятора? Не совсем понял.

1exan
28.09.2023, 10:35
Это нужно создать Task в codesys и из него вызывать ФБ пид регулятора? Не совсем понял.

Да, только вызывать конечно не сам ФБ, а программный модуль, его содержащий

senkos
28.09.2023, 11:23
То есть создаю новый программный блок PID_Timer.
Объявляю глобальную переменную pv_time.
В программном блоке инкрементирую pv_time := pv_time + 100;
Создаю Таск с цикличностью 100мс и прикрепляю к нему PID_Timer.
В основной программе в ФБ на вход Pv_Time вставляю мою глобальную переменную pv_time.

Обнуление pv_time будет автоматически происходить при переполнении?

1exan
28.09.2023, 11:49
То есть создаю новый программный блок PID_Timer.
Объявляю глобальную переменную pv_time.
В программном блоке инкрементирую pv_time := pv_time + 100;
Создаю Таск с цикличностью 100мс и прикрепляю к нему PID_Timer.
В основной программе в ФБ на вход Pv_Time вставляю мою глобальную переменную pv_time.

Обнуление pv_time будет автоматически происходить при переполнении?

Не понял зачем нужна глобальная - в той же программе, где и пид инкрементируйте локальную переменную.
И насчёт значения 100 не уверен, в описании написано единица измерения 1/100сек, получается надо прибавлять не 100, а 10?
Беззнаковый тип должен сам обнулиться

senkos
28.09.2023, 13:25
Не понял зачем нужна глобальная - в той же программе, где и пид инкрементируйте локальную переменную.


Сам PLC_PRG имеет много другого кода, в нем же и ПИД регулятор реализую. А в программе PID_Timer(PRG) только pv_time := pv_time + 10;
Если pv_time будет не глобальная тогда она не видима будет из PLC_PRG где сам пид регулятор прописан.
Так же если я буду реализовывать пид в PID_Timer(PRG) то куча других переменных будет невидима, которые получаются в основной проге.

Или я концептуально не правильно подошел? И нужно пид исполнить в PID_Timer(PRG) чтобы он по Таску отрабатывал каждые 100мл сек?
А в основной программе присваиваю значения в глобальную структуру например data_for_PID

1exan
28.09.2023, 13:43
Сам PLC_PRG имеет много другого кода, в нем же и ПИД регулятор реализую. А в программе PID_Timer(PRG) в только pv_time := pv_time + 10;
Если pv_time будет не глобальная тогда она не видима будет из PLC_PRG где сам пид регулятор прописан.
Так же если я буду реализовывать пид в PID_Timer(PRG) то куча других переменных будет невидима, которые получаются в основной проге.

Я не уверен, что так будет работать.
В принципе, никто не запрещает обращаться к пеерменной другого программного блока через "ИМЯ_ПРОГРАММЫ.ИМЯ_ПЕРЕМЕННОЙ"

kondor3000
28.09.2023, 14:48
То есть создаю новый программный блок PID_Timer.
Объявляю глобальную переменную pv_time.
В программном блоке инкрементирую pv_time := pv_time + 100;
Создаю Таск с цикличностью 100мс и прикрепляю к нему PID_Timer.
В основной программе в ФБ на вход Pv_Time вставляю мою глобальную переменную pv_time.

Обнуление pv_time будет автоматически происходить при переполнении?

На сколько я знаю, те кто работает с PID регуляторами берут циклическое время измерения прямо с нужного входа МВ110-8А (8АС) и не парятся.
У вас этого добра уже навалом с 7 блоков.

1exan
28.09.2023, 17:09
Сам PLC_PRG имеет много другого кода, в нем же и ПИД регулятор реализую. А в программе PID_Timer(PRG) только pv_time := pv_time + 10;
Если pv_time будет не глобальная тогда она не видима будет из PLC_PRG где сам пид регулятор прописан.
Так же если я буду реализовывать пид в PID_Timer(PRG) то куча других переменных будет невидима, которые получаются в основной проге.

Или я концептуально не правильно подошел? И нужно пид исполнить в PID_Timer(PRG) чтобы он по Таску отрабатывал каждые 100мл сек?
А в основной программе присваиваю значения в глобальную структуру например data_for_PID

У меня примерно такой подход

senkos
29.09.2023, 11:49
Почему так получилось, когда я добавил Task с периодичностью 100мс на выполнение даже пустой программы PID_Timer(PRG), то у меня перестает работать основная программа. В плане того что на панели не выводятся даже данные. Отключаю Таск и все нормально становится.

1exan
29.09.2023, 11:58
Почему так получилось, когда я добавил Task с периодичностью 100мс на выполнение даже пустой программы PID_Timer(PRG), то у меня перестает работать основная программа. В плане того что на панели не выводятся даже данные. Отключаю Таск и все нормально становится.


Если диспетчер задач не используется, то по умолчанию выполняется программный блок с именем "PLC_PRG" (в режиме свободного выполнения наверное).
Если используется диспетчер задач, то все необходимые программные блоки надо вызывать явно.
Можете добавить основную программу в ту-же задачу, что и пид - или создать для неё ещё один task, например со свободным выполнением

senkos
29.09.2023, 13:30
Если диспетчер задач не используется, то по умолчанию выполняется программный блок с именем "PLC_PRG" (в режиме свободного выполнения наверное).
Если используется диспетчер задач, то все необходимые программные блоки надо вызывать явно.
Можете добавить основную программу в ту-же задачу, что и пид - или создать для неё ещё один task, например со свободным выполнением

Спасибо! Сделал отдельными Тасками. PLC_PRG нужно тип "Свободная", а для PID тип "Циклическая". Работает ))

In_Da_Cher_A
29.09.2023, 14:58
Здравствуйте. Прошу помочь со следующим.
Использую библиотеку для snmp от ОВЕН. Создал нужные OSNMP.Manager, OSNMP.VARBIND. При запуске поля принимают нужные значения. Но опрос никак не стартует.7059970600
это выше раздел, здесь не тот кодесис

Ledkouq
02.10.2023, 15:49
Доброго времени суток.
ПЛК63 +МК110-220.4ДН-4Р

текущая проблема - MB_WR_REGS не завершается, хотя значение на выходе устанавливает.
adr_DO :BYTE :=0; (адрес дискретного выхода)
run_DO :DINT :=1000; (значение на выходе)


не судите строго. привык работать в CFC + очень сильно погорячился при выборе оборудования, не сознавал еще работы с протоколами и библиотеками.
задача минимум:
1. организовать опрос дискретных входов (маска дискретных входов. функция 3. адрес 51),
2. выставить дискретные выходы (функция 16. адреса дискретных выходов: до1-0 до2-1 до3-2 до4-3). начал с одного. адреса , если поможете реализовать включение нескольких (через маску???) - буду признателен,
3. прочитать в каком состоянии находятся дискретные выхода (маска дискретных выходов. функция 3. адрес 50)

По примерам к ПЛК63(Модбас_ASCII) по одиночке реализовывал функции чтения и записи. все читалось, все включалось.
Воедино трепыхается как может, но только не работает.

Вангую проблемы с буфером. Я не до конца сознаю процесс перезаписи (+очистки???) оного.

kondor3000
02.10.2023, 16:28
Доброго времени суток.
ПЛК63 +МК110-220.4ДН-4Р

текущая проблема - MB_WR_REGS не завершается, хотя значение на выходе устанавливает.
adr_DO :BYTE :=0; (адрес дискретного выхода)
run_DO :DINT :=1000; (значение на выходе)


Вангую проблемы с буфером. Я не до конца сознаю процесс перезаписи (+очистки???) оного.

Возьмите тот же пример на ST, чтение и запись разнесите в разные программы, или в разные шаги CASE, всё.
Фактически скопируете и вставите, поменять только адреса блоков и регистров. Модбас_ASCII поменяйте на Модбас_RTU
Вот подобная разжёваная тема с примерами, ссылками. https://owen.ru/forum/showthread.php?t=36679

На всё понадобилось 5 минут, чтение и запись в разных шагах CASE, 0- чтение маски входов и выходов, 1- запись маски выходов, 70652
входы и выходы разложены на 4 бита, через точку ( с 0 по 3)
В качестве модуля, использован Инсатовский ОРС сервер в режиме слейв 70653

senkos
03.10.2023, 11:44
Помогите пожалуйста выбрать ПИД регулятор.
Имеется электрическая задвижка (время хода 60 сек). Контакты Открыть/Закрыть.
Номинальное давление 6 Бар.
Если давление растет задвижка приоткрывается на нужную величину от 0 до 100%.
Если давление становится ниже номинального, то задвижка закрыта.

Какой выбрать ФБ для этой задачи? не могу осилить регулятор PID_3POS_IM_ANR из библиотеки PID_Regulators.lib
Как только давление становится выше 6 то на выходе из PID устанавливается значение #QNAN

Заметил что вроде как он наоборот работает, когда давление падает он начинает что то менять и подавать сигналы на задвижку, а когда растет то уходит в какой то блок. А нужно наоборот.

Ledkouq
03.10.2023, 12:36
Спасибо за содержательный ответ. Прошу еще немного помощи. Не хватает теории реализовать групповую запись 0х10 дискретных выходов 1-4.
на данный момент:
1.дискретные входа читаются, (значение х)
2.дискретные выхода по одиночке выставляются. в примере на CFC сначала выставляю 0/1000 (выкл/вкл) и номер регистра (дискретного выхода).
3.маска дискретных выходов почему-то не читается...(значение y) Я же правильно понимаю, что под маской понимается текущее состояние дискретных выходов (функция чтения а не функция записи)

1exan
03.10.2023, 13:13
Спасибо за содержательный ответ. Прошу еще немного помощи. Не хватает теории реализовать групповую запись 0х10 дискретных выходов 1-4.
на данный момент:
1.дискретные входа читаются, (значение х)
2.дискретные выхода по одиночке выставляются. в примере на CFC сначала выставляю 0/1000 (выкл/вкл) и номер регистра (дискретного выхода).
3.маска дискретных выходов почему-то не читается...(значение y) Я же правильно понимаю, что под маской понимается текущее состояние дискретных выходов (функция чтения а не функция записи)

Возможно после записи нужна некоторая задержка перед следующим запросом?
Без шага записи чтение будет выполняться?

Artem2928a
03.10.2023, 13:59
День добрый
Имеется плк 160, хотелось бы узнать как управлять им с компьютера, нарисовать визуализацию и управлять входами с экрана пк.

kondor3000
03.10.2023, 14:50
День добрый
Имеется плк 160, хотелось бы узнать как управлять им с компьютера, нарисовать визуализацию и управлять входами с экрана пк.

Начните с просмотра обучающих видео их около 15 https://www.youtube.com/watch?v=hm_om_-8ins&list=PL144mKGdm0ZNy5g-ujn245KJLrcybuJ64&index=3

kondor3000
03.10.2023, 15:21
Спасибо за содержательный ответ. Прошу еще немного помощи. Не хватает теории реализовать групповую запись 0х10 дискретных выходов 1-4.
на данный момент:
1.дискретные входа читаются, (значение х)
2.дискретные выхода по одиночке выставляются. в примере на CFC сначала выставляю 0/1000 (выкл/вкл) и номер регистра (дискретного выхода).
3.маска дискретных выходов почему-то не читается...(значение y) Я же правильно понимаю, что под маской понимается текущее состояние дискретных выходов (функция чтения а не функция записи)

1) Функция 0х03, позволяет читать группу регистров, например с 0 по 100, у вас всего 2 регистра 50 и 51, так и читайте их оба сразу.

DevAddr:=1 , (*адрес*)
FirstAddr:=50 , (*адрес 1 регистра *)
Quantity:=2, (*количество регистров*)
Читать 2 регистра
w1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
w2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);

2) Функция записи 0х10 (16) позволяет записывать тоже группу регистров, но у вас он только 1, адрес 50 70677
send1_modbus: MB_WR_REGS; (*функция 16 - запись параметров*) у вас в программе не правильно скопировано, у меня на скрине как раз запись.
И записывать надо тоже маску WORD, а не биты как вы пытаетесь сделать, скин смотрите. Там есть и сборка бит в маску, для записи и разбор бит из маски для чтения.
Почти всё правильно , кроме самой функции в программе

DevAddr:=1 , (*адрес*)
FirstAddr:= 50, (*адрес 1 регистра*)
Quantity:= 1, (*количество записываемых регистров*)

3) 2 шаг вообще выбросьте, а первый отредактируйте правильно.

Чтобы не было ошибки INVALID, скопируйте и вставьте биб-ку по пути C:\Program Files (x86)\3S Software\CoDeSys V2.3\Library
старую переименуйте или удалите

senkos
04.10.2023, 14:33
Доброго дня! Подскажите пожалуйста каким образом я могу подключить в локальную сеть ПЛК110-30(M02), чтобы можно было подключаться с компьютера например через встроенную визуализацию в codesys?
Или может какие более удобные есть системы?

Cs-Cs
04.10.2023, 14:54
Доброго дня! Подскажите пожалуйста каким образом я могу подключить в локальную сеть ПЛК110-30(M02), чтобы можно было подключаться с компьютера например через встроенную визуализацию в codesys?
Или может какие более удобные есть системы? В CodeSys 2.3 встроенные визуализации работают ТОЛЬКО в среде разработки. По HTTP или ещё как-то извне они НЕ работают.

kondor3000
04.10.2023, 14:55
Доброго дня! Подскажите пожалуйста каким образом я могу подключить в локальную сеть ПЛК110-30(M02), чтобы можно было подключаться с компьютера например через встроенную визуализацию в codesys?
Или может какие более удобные есть системы?

Смотря, что вам нужно.
Если подключаться к ПЛК через Сodesys и встроенную визуализацию, назначьте для него IP, маску и шлюз, как в локальной сети, IP с другими последними цифрами. И подключайтесь.

In_Da_Cher_A
04.10.2023, 14:56
каким образом я могу подключить в локальную сеть ПЛК110-30(M02)патч-корд, сеть Ethernet, коммутатор

Или может какие более удобные есть системы?любая SCADA система. Степень удобности зависит от ваших вкусовых предпочтений какого-то конкретного цвета фломастеров

senkos
04.10.2023, 15:20
Спасибо за ответы! Как я понял, нужно прописать настройки локальной сети в файле local_addres.dat и загрузить его в ПЛК.
Какой пункт выбрать в Codesys в меню "Параметры связи"? TCP/IP, TCP/IP (Level2), TCP/IP (Level2 Route)
Задача №1 - удаленная коррекция программы в codesys и загрузка ее в ПЛК.
Задача №2 - организация на компе своей визуализации.

kondor3000
04.10.2023, 15:44
Спасибо за ответы! Как я понял, нужно прописать настройки локальной сети в файле local_addres.dat и загрузить его в ПЛК.
Какой пункт выбрать в Codesys в меню "Параметры связи"? TCP/IP, TCP/IP (Level2), TCP/IP (Level2 Route)
Задача №1 - удаленная коррекция программы в codesys и загрузка ее в ПЛК.
Задача №2 - организация на компе своей визуализации.

local_addres.dat прописывать надо для Облака Овен клауд.

Для подключения ПЛК к сети, всё делается через ПЛК браузер. 70698
Команда PLCInfo - общая информация, SetIP - установка IP и т. д.
после установки всех параметров IP, маски и шлюза, перезагрузить по питанию и потом подключаться по новому IP
В меню TCP/IP (Level2)

senkos
04.10.2023, 16:13
local_addres.dat прописывать надо для Облака Овен клауд.

Для подключения ПЛК к сети, всё делается через ПЛК браузер. 70698
Команда PLCInfo - общая информация, SetIP - установка IP и т. д.
после установки всех параметров IP, маски и шлюза, перезагрузить по питанию и потом подключаться по новому IP
В меню TCP/IP (Level2)

Благодарю, настроил.

Для второй задачи по визуализации на компе нужно использовать OvenCloude для сбора там всех переменных?

kondor3000
04.10.2023, 16:17
Благодарю, настроил.

Для второй задачи по визуализации на компе нужно использовать OvenCloude для сбора там всех переменных?

Визуализация есть в Codesys, создайте, настройте и работайте.

МихаилГл
04.10.2023, 17:40
Визуализация есть в Codesys, создайте, настройте и работайте.

Ему скорее нужна визуализация не из среды разработки, а какая-нибудь скада, например rapid scada

Zhan
05.10.2023, 07:48
Добрый день!

Канал по автоматизации....

https://www.youtube.com/channel/UC1ecPyOvHfVnq4JEbSbR0dA

senkos
05.10.2023, 08:17
А чтобы не связываться с платными скадами и клаудами, у OPC сервера есть возможность отдавать переменные внешнему приложению, например если я напишу на C# свой клиент?

kondor3000
05.10.2023, 08:26
А чтобы не связываться с платными скадами и клаудами, у OPC сервера есть возможность отдавать переменные внешнему приложению, например если я напишу на C# свой клиент?

Есть и бесплатные скады, на 32 тега без ограничения времени или на час работы, например очень простая и удобная Симп лайт https://simplight.ru
Есть видео на ютуб, проект с нуля можно сделать за час.

Можете и свой клиент написать, в Codesys есть встроенный Codesys OPC.02 (передача символьной конфигурации, всех переменных даже с ПЛК мастера)70729
Симп лайт может его тоже использовать, а так же встроенный Модбас или ТСР сервер и любой внешний ОРС.

Или просто со слейва читайте что надо из ПЛК и передавйте, по любому порту.

Nerion
05.10.2023, 13:09
Добрый день!
Как собрать слово из массива байтов полученных от slave устройства по modbus. Значения до 255 нормального вида выходят. Но при переполнении байта данные в массиве превращаются во что то не понятное. Использовал Modbus.lib функцию MB_RD_HOLD_REGS.

kondor3000
05.10.2023, 15:16
Добрый день!
Как собрать слово из массива байтов полученных от slave устройства по modbus. Значения до 255 нормального вида выходят. Но при переполнении байта данные в массиве превращаются во что то не понятное. Использовал Modbus.lib функцию MB_RD_HOLD_REGS.

Собрать целочисленные типа WORD из байт буфера можно так:
w1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
w2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);

А вообще на сайте есть примеры чтения и записи по Модбас с помощью биб-к, скачайте и проверяйте.
Примеры сетевого обмена
10) Обмен через библиотеки Modbus и OwenNet https://owen.ru/product/codesys_v2/example_program

МихаилГл
05.10.2023, 16:43
А чтобы не связываться с платными скадами и клаудами, у OPC сервера есть возможность отдавать переменные внешнему приложению, например если я напишу на C# свой клиент?

Рапид скада бесплатна. Немного неудобна в разработке визуализации, но достаточно функциональна и интересна в других моментах.

И вроде в ней можно использовать скрипты из с#.

melky
05.10.2023, 16:55
senkos если пишите на C# то посмотрите в сторону RapidScada. Скрипты в ней больше относятся к каналам, а вот можно написать модуль сервера для более глобальных каких-то задач.
Что касается визуализации тоже можно свои компоненты делать, но там уже и JS надо знать и пока неудобно, так как для редактора схем придется писать для 5-й версии, а для веб для 6-й. Редактор пока не перерабатывался.

Исходники все открыты.

senkos
06.10.2023, 15:24
senkos если пишите на C# то посмотрите в сторону RapidScada. Скрипты в ней больше относятся к каналам, а вот можно написать модуль сервера для более глобальных каких-то задач.
Что касается визуализации тоже можно свои компоненты делать, но там уже и JS надо знать и пока неудобно, так как для редактора схем придется писать для 5-й версии, а для веб для 6-й. Редактор пока не перерабатывался.

Исходники все открыты.

А RapidScada какой OPC сервер использует?
Я не могу никак запустить Codesys OPC Server в связке c Симп лайт. Вроде настроил все как по видео так и по текстовым инструкциям:
- в Codesys в меню Проект => Опции установил чекбокс "Создавать описания"
- в настройках целевой платформы во вкладке Общие установил "Загружать символьный файл"
но в логах выдает

**** ОШИБКА: <PLC1> Не удалось загрузить символы в автономном режиме.
7076170762

В целом даже нашел мануал по написанию клиентской части на C# для OPC DA, но как настроить это сервер чтобы он не вылетал из-за ошибок?

melky
06.10.2023, 16:46
RapidScada не является OPC DA сервером. OPC UA сервер у нее только для Коммуникатора, то, что он опрашивает, может передавать как OPC UA сервер.
Клиенты есть и OPC DA для Windows и OPC UA, для Linux клиент только OPC UA.

Непонятно, зачем опрашивать устройство Modbus через OPC CodeSys если можно опрашивать напрямую по Modbus?, Modbus мастер встроен в RapidScada
Для OPC DA клиента scada использует библиотеки OPC Core Components 3.00.108

senkos
06.10.2023, 17:00
RapidScada не является OPC DA сервером. OPC UA сервер у нее только для Коммуникатора, то, что он опрашивает, может передавать как OPC UA сервер.
Клиенты есть и OPC DA для Windows и OPC UA, для Linux клиент только OPC UA.

Непонятно, зачем опрашивать устройство Modbus через OPC CodeSys если можно опрашивать напрямую по Modbus?, Modbus мастер встроен в RapidScada
Для OPC DA клиента scada использует библиотеки OPC Core Components 3.00.108

Да я просто хочу освоить эти все технологии, чтобы представление иметь о каждой системе. Освою OPC сервер, пойду к Скаде. Потом в планах свой клиент создать с оповещением и запросами например в телеге.

kondor3000
06.10.2023, 18:04
Я не могу никак запустить Codesys OPC Server в связке c Симп лайт. Вроде настроил все как по видео так и по текстовым инструкциям:
- в Codesys в меню Проект => Опции установил чекбокс "Создавать описания"
- в настройках целевой платформы во вкладке Общие установил "Загружать символьный файл"
но в логах выдает
В целом даже нашел мануал по написанию клиентской части на C# для OPC DA, но как настроить это сервер чтобы он не вылетал из-за ошибок?

Вот видео по настройке, вам кроме сервера надо настроить вывод символьной конфигурации в проекте,
а потом уже запускать скаду и выбрать Codesys.OPC.02
https://www.youtube.com/watch?v=B03Fi_P2sqk&t=494s
https://www.youtube.com/watch?v=uqRzRgkYQ7I&t=21s

melky
06.10.2023, 22:59
senkos посмотрите сколько будет стоить для себя оповещение по Telegram на RapidScada. Там есть на сайте.
Потребуется Модуль автоматического управления и драйвер собственно Telegram - стоит ваше потраченное время дешевле предложенной разработчиком цены ?
Ну и посмотрите какие возможности есть в бесплатном варианте.

изобретатель велосипедов :)

senkos
07.10.2023, 10:00
senkos посмотрите сколько будет стоить для себя оповещение по Telegram на RapidScada. Там есть на сайте.
Потребуется Модуль автоматического управления и драйвер собственно Telegram - стоит ваше потраченное время дешевле предложенной разработчиком цены ?
Ну и посмотрите какие возможности есть в бесплатном варианте.

изобретатель велосипедов :)

Все делается с целью личного развития и изучения, мне интересно писать код, тупить над ним часами а потом получать эндорфины от найденных решений. Мне интересно как это строится изнутри, ясен пень что есть множество уже готовых библиотек и сервисов, но...

Вытащив переменные в C# привязать их к боту в телеге не проблема.