PDA

Просмотр полной версии : Прямое чтение портов СПК107[M01]



PupaJr
19.09.2023, 17:41
Доброго дня.
Для анализа ошибок системы в лог файл собираю данные, одними из них являются данные по портам - их мгновенный снимок.
Тоесть 2 порта на 32 входа и на 32 выхода - их состояние мгновенно при сбое копируются в переменные типа DWORD.
В своей процедуре "алармов" я делаю это копирование:

PortIn1:=%IW10;
PortIn2:=%IW12;

Интересно то, что это работает со входами!! а с ВЫходами нет!! компилятор пишет что нарушена процедура присвоения (или происходит переназначение...)

PortOut1:=%QW0;
PortOut2:=%QW2;

Хотя по сути я просто беру область входов или выходов и кладу их в переменную а не наоборот!!
Как можно сделать снимок/слепок сразу всех выходов ?

Евгений Кислов
19.09.2023, 19:15
Добрый день.


Как можно сделать снимок/слепок сразу всех выходов ?

Путем привязки переменных к нужным вам каналам компонентов.

PupaJr
20.09.2023, 04:06
А они уже привязаны - каждый бит - своя переменная и привязать всё слово на переменную типа WORD не даёт - ругается что переназначение происходит. Это же работает со входами, а почему на выхода не работает -вот это интересно, или по тому что это выхода их состояние читать нельзя ?? - это бред, выходной регистр тоже должен быть доступен для чтения.

МихаилГл
20.09.2023, 04:14
В столбец "соотнесение" (Или переменная) пропиши свои переменные. С ними можно делать что угодно. Это и удобнее, можешь переменные массива туда прописать и одной строкой цикла всё обрабатывать.

PupaJr
20.09.2023, 05:46
хе, Вы думаете это я не делал, писал же что не даёт - вот картинка... или я не так делаю... Вы сами попробуйте 2 переменные написать на один порт.

1exan
20.09.2023, 05:58
А они уже привязаны - каждый бит - своя переменная и привязать всё слово на переменную типа WORD не даёт - ругается что переназначение происходит. Это же работает со входами, а почему на выхода не работает -вот это интересно, или по тому что это выхода их состояние читать нельзя ?? - это бред, выходной регистр тоже должен быть доступен для чтения.

Наверное потому, чтобы не было конфликта при изменении выхода одновременно и через битовые переменные и через маску. А вот при чтении в виде маски или отдельных бит проблем нет.
Возможно здесь поможет объединение (UNION)

МихаилГл
20.09.2023, 06:17
хе, Вы думаете это я не делал, писал же что не даёт - вот картинка... или я не так делаю... Вы сами попробуйте 2 переменные написать на один порт.

Вот у меня так, только одно отличие, у меня сразу Word'у присвоение, не битам внутри, все работает, никаких конфликтов

МихаилГл
20.09.2023, 06:23
Вот отдельно по битам выхода...

И почему у вас в имени переменной фигурирует TargetVars? Какая версия codesys'а. Может конечно не в 3.5.17 по-другому, не помню если честно...

МихаилГл
20.09.2023, 06:38
А они уже привязаны - каждый бит - своя переменная и привязать всё слово на переменную типа WORD не даёт - ругается что переназначение происходит. Это же работает со входами, а почему на выхода не работает -вот это интересно, или по тому что это выхода их состояние читать нельзя ?? - это бред, выходной регистр тоже должен быть доступен для чтения.

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

PupaJr
21.09.2023, 13:03
Каждый бит это какой-то вход или выход, я их сделал все глобальными переменными, чтобы с любого места до них можно было достучаться (как в Си).
В описании портов - они и привязаны, я с начала хотел сделать через слова а потом в программе с помощью логических операций И/ИЛИ вычленять биты по маске.. но это показалось мне нудятиной.. поскольку есть нормальная возможность работать сразу с битами вот и отказался от чтения всего слова.. а вот пришлось вернуться к этой идее а "среда" не даёт привязать одновременно и битовые описния портов и слово порта - или то или то... может у меня просто не получается... :(

melky
21.09.2023, 13:09
Val.0 или Val.3 это нудятина ?

А если булевым переменным хотите дать имена, ну пропишите один раз где-нибудь stop := Val.0 и так далее

Cs-Cs
21.09.2023, 15:26
Каждый бит это какой-то вход или выход, я их сделал все глобальными переменными, чтобы с любого места до них можно было достучаться (как в Си).
В описании портов - они и привязаны, я с начала хотел сделать через слова а потом в программе с помощью логических операций И/ИЛИ вычленять биты по маске.. но это показалось мне нудятиной.. поскольку есть нормальная возможность работать сразу с битами вот и отказался от чтения всего слова.. а вот пришлось вернуться к этой идее а "среда" не даёт привязать одновременно и битовые описния портов и слово порта - или то или то... может у меня просто не получается... :(
Я делаю через битовые маски. Это не так уж сложно, но удобно. Вот здесь всё описал: https://cs-cs.net/technologii-testirovaniya-i-otladky-shhgitov-s-svtomatikoy-na-plk#4_____io (и дальше про выходы и их тестирование)

PupaJr
22.09.2023, 04:45
Да, хорошо, но это "жуткое" дело в плане "писанины".. ООООчень много буков :) ... Щит в Вашей статье зачетный ! . Меня больше всего смутило то, что на входа работает чтение слов а на выхода нет.. Может как раз компилятор и думает что я хочу писать в порты "множественно".. Где это отключить/посмотреть?

Cs-Cs
26.09.2023, 11:02
Да, буков много. Это рассчитано на тех, кому надо получить много информации, а не shorts'ы глядеть, где ни фига не поймёшь.
Во-первых, входЫ и выходЫ. Не надо коверкать язык.
Во-вторых, ПЛК и их железо не похоже на Ардуины или микрофонтроллеры, и поэтому "Портов" в ключе IO тут нет и не будет. Портами тут называются устройства, через которые ПЛК связывается с чем-то: RS-232, RS-485, Ethernet. С ними работать напрямую можно. Для этого надо отключить всю встроенную логику опроса устройств и руками с нуля написать код для приёма и отправки нужных данных побайтно. Вот это будет похоже на микроконтроллеры, где надо с нуля сделать Modbus или какой-то свой протокол.
В-третьих, так у меня же дальше написано, как управлять выходами через битовые маски. Вот их же можно как раз и в журнал писать. Шо не так? =)

Отключать множественную запись в выходные переменные НЕ надо.