Я сейчас работаю с ПЛК от Siemens и моя задача сейчас реализовать с его помощью некоторые действия на Python. Для этого я использую Snap7 для чтения и записи значений. Я еще новичок в этой теме, поэтому возник вопрос (после просмотра видео и чтения документации пакета).
Я определил на портале TIA пару тегов: %MD0, содержащий вещественное значение, %MW0, также содержащий вещественное значение, и %QW0 как аналоговый вывод (int).
Мне нужно прочитать значения %MD0 и %MW0. Я хочу использовать функцию read_area, которая имеет следующие аргументы:
У меня проблема в том, что при чтении значений %MD0 и %MW0 как я могу быть уверен, какое из них я читаю? Поскольку аргументы будут практически такими же:
read_area(snap7.types.Areas.MK, 0, 0, 2)
Кто-нибудь уже это понял? Или лучше всего было бы использовать разные номера для тегов, чтобы избежать путаницы, например %MD0, %MW1, %QW3 и т. д.?
Я пробовал использовать очень простой код и эмуляцию ПЛК, включенную в портал TIA. До сих пор не могу найти способ определить, с какого тега я читаю.
С вашей стороны возникла небольшая путаница: вы пытаетесь прочитать перекрывающиеся области памяти, поэтому, когда вы определяете %MDO
, вы определяете двойное слово, которое означает 4 байта, а когда вы определяете %MW0
, вы определяете слово, которое означает 2 байта.
Допустим, у вас есть %MD0
4 символа, потому что 1 символ = 1 байт.
%MD0[0] = 16#30;
%MD0[1] = 16#31;
%MD0[2] = 16#32;
%MD0[3] = 16#33;
поэтому, если вы попытаетесь прочитать %MW0
длиной 2 байта, вы получите следующий результат:
%MW0[0] = 16#30;
%MW0[1] = 16#31;
Итак, согласно вашему примеру, единственный способ определить, какую область памяти вы читаете, - это запомнить, какую длину вы определили в своей функции read_area
.
На самом деле вы ошибаетесь, пытаясь прочитать области памяти с одинаковыми параметрами, чтобы прочитать %MD0
, вам нужно вызвать функцию read_area
со следующими параметрами:
read_area(snap7.types.Areas.MK, 0, 0, 4)
А чтобы прочитать %MW0
вам нужно использовать следующие параметры:
read_area(snap7.types.Areas.MK, 0, 0, 2)
Итак, как было сказано, если вы дадите length = 4
, вы читаете %MD0
, а если length = 2
, вы читаете %MW0
.
Спасибо, Дон Мигель Санчес. Очень понятно объяснил!
для вопроса требуется достаточный код для минимально воспроизводимого примера