PDA

Просмотр полной версии : Разные переменные в одном канале регистров



MichailG
20.01.2025, 17:42
Здравствуйте! Помогите пожалуйста грамотно разделить переменные. Есть канал для чтения допустим 10 real переменных, соответственно это 20 регистров. Создаю union из переменной типа real и массива [0..1] of word. Есть еще bool переменные. Будет ли корректным создать канал не из 20 регистров, а из 22 регистров. Первые 2 регистра будут зарезервированы для чтения bool переменных. При этом отдельным каналом будет сконфигурирована запись во 2-й регистр bool переменных. Я хочу массив объединения real_ указать в канале из 22 регистров и в 1-м и 2-м регистре указать в битовых каналах сами bool переменные. Реальные значения с плавающей точкой будут считаны начиная со 2-го элемента массива. Правильно ли это? И все это ради одно запроса вместо 2-х.

МихаилГл
20.01.2025, 18:02
СПК, как понимаю, это слэйв... Делайте как вам удобней. Аы для мастера хотите тепличных условий? Но мастера бывают разными. Если будет много регистров (больше 127 вроде), то он все равно сделает 2 массовых опроса. Тем более некоторые читают только активные на дисплее регистры, делая окна в опросах. Не забивайте голову, главное учитывайте смещение, ну вы я смотрю в курсе.

MichailG
20.01.2025, 18:42
СПК будет мастером, а ПЛК 150/160 будут слейвами. Для ПЛК конфигурация будет 8bit, 8bit, 8bit, 8bit, float, ..., float. Просто я думал с одного и того же канала будут записаны float переменные в массив и bool переменные, не будет ли конфликта? А про разбивку на 2 опроса - спасибо за наводку. С помщью Modbus Poll я думаю смогу отследить эту ситуацию. Благодарю!

МихаилГл
20.01.2025, 18:52
Ну это тоже плк, где вы сформируете регистры сами. И модбас по идее не знает, что у него за формат данных, он передает ворд'ы. А мастер сам их должен конвертировать в понятный формат. Только тогда лучше читать ворд'ы, а вспомогательной POU конвертировать. Я так делаю.

MichailG
20.01.2025, 19:15
Вы работаете с указателями? Типа в 0-й байт пишете по адресу с 1-го ворда, а во 2-й байт пишете по адресу со 2-го ворда? В итоге сформирована real переменная? Тогда можно и по-отдельности извлекать и bool переменные... Я видел пример и сам так делал по перестановке байт ABCD в CDAB.

kondor3000
20.01.2025, 19:18
Вы работаете с указателями? Типа в 0-й байт пишете по адресу с 1-го ворда, а во 2-й байт пишете по адресу со 2-го ворда? В итоге сформирована real переменная? Тогда можно и по-отдельности извлекать и bool переменные...

В данном случае указатели не нужны, читаете массив WORD и из массива берёте либо маску бит, либо 2 переменные WORD, для получения FLOAT.
Тоже самое и с записью, например в [0] и [1] WORD упаковываете по 16 бит, FLOAT раскладываете на 2 WORD и складываете в массив,
например в [2] и [3]

MichailG
20.01.2025, 19:28
Можно пожалуйста пример, понять не могу как это сделать?

kondor3000
20.01.2025, 19:30
Можно пожалуйста пример, понять не могу как это сделать?

Что конкретно не понятно? Как массив регистров сделать для чтения или как разложить на 2 WORD ?

Чтение и запись по 16 регистров 81444 Соотнесение 81445 Упаковка, распаковка и REAL 81447

МихаилГл
20.01.2025, 19:33
Можно пожалуйста пример, понять не могу как это сделать?

Создаете массив из количества ворд равному количество реал * 2 плюс минимальное целое от количества бит / 32 * 2. Эти ворды соотносите с таблицей регистров. А где нибудь в программе биты это ворд.х, а реалы это ваши юнионы. Можно многими способами, но я так делаю.

MichailG
20.01.2025, 20:32
Спасибо, вроде ясно, завтра буду пробовать.