Jump to content

    
turnon

Безумные конфигурации карты регистров modbus

Recommended Posts

Делаю устройство/мастер RS485, где регистры modbus, из размер, типы конфигурируются через API. Цель - получать значения регистров в уже переваренном для пользователя виде - в нужных единицах, с суффикcом единицы измерения, со значением "null" при определенном значении регистра и т.д.

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

Все возможные типы данных:

  MRT_COIL,
  MRT_BOOL,
  MRT_I8,
  MRT_U8,
  MRT_I16,
  MRT_U16,
  MRT_I32,
  MRT_U32,
  MRT_I64,
  MRT_U64,
  MRT_F32,
  MRT_F64,
  MRT_STRING

 

Для MRT_STRING задается размерность, напеример "s8"- строка 8 символов

 

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

  MRBO_BE, // Float - Big Endian (ABCD), UINT16 - Big Endian (AB)
  MRBO_LE, // Float - Little Endian (DCBA), UINT16 - Little Endian (BA)     
  MRBO_MBE, // Float - Mid-Big Endian (BADC)
  MRBO_MLE, // Float - Mid-Little Endian (CDAB)  
 

Строка конфигурации регистра выглядит как перечисление через точку с запятой, например: "T;i16; °C;v/100;v==-32768" - name, type, unit, valueExpr, nullExpr
valueExpr - выражение для вычисления значения из значения регистра
nullExpr - если выражение возвращает true, значит вместо значения регистра выводим "null"

 

Далее примеры.

Spoiler

 


        {
          "read":3,
          "start":0x100,
          "regs":[
            "STAT;u16",
            "PV1;i16",
            "PV2f;f32"
            "VER;s8"
          ]
        }

 

Чтение регистров разной размерности, будет прочитано 3-й фукцией с адреса 0x100 2+2+4+8 байт

 


        {
          "read":3,
          "start":10,
          "regs":[
            "T1;u16"
          ]
        },
        {
          "read":3,
          "start":20,
          "regs":[
            "T2;u16"
          ]
        }

Чтение двух регистров с несмежных адресов, функция 3, адреса 10 и 20

 


        {
          "read":3,
          "start":0,
          "regs":[
            "T1;u16;;lo(x)"
          ]
        },
        {
          "read":3,
          "start":0,
          "regs":[
            "T2;u16;;hi(x)"
          ]
        }

Чтение функцией 3 с адреса 0, два значения, T1 и T2 - получаем из одного регистра, в T1 - младший разряд, в T2 - старший разряд.

 


        {
          "read":4,
          "start":30000,
          "regs":[
            "T1;i16; °C;x/100;x==-100",
            "T2;i16; °C;x/100;x==-100"
          ]
        }

1 c адреса 30000, T2 с адреса 30001, единица измерения " °C", значение регистра делим на 100, при значении регистра -100 выводим "null"

 


        {
          "read":3,
          "start":0x200F,
          "regs":[
            "T;u16;;map(x,0,0xFFFF,-40,120)"
          ]
        }

Значение регистра 0..0xFFFF отображаем в диапазон -40..120

 


        {
          "read":3,
          "expr":"iif(x>10000,-(x-10000)/10,x/10)",
          "regs":[
            "T1;u16",
            "T2;u16",
            "T3;u16"
          ]
        }

Для всех трех регистров применяется формула "iif(x>10000,-(x-10000)/10,x/10)"

 


    {
      "read":4,
      "start":30000,
      "regs":[
        "STAT;u16"
        "T1;i16; °C;x/10;bit({stat},0)",
        "T2;i16; °C;x/10;bit({stat},1)"
      ]
    }

В формуле в качестве аргумента используется значение другого регистра (биты 0 и 1 индицируют отсутствие значение регистра T1 и T2)

 


       {
          "read":1,
          "start":0x7530,
          "regs":[
            "ON;c;;!x"
          ]
        }

Инверсия значения регистра типа COIL.

 

Share this post


Link to post
Share on other sites
1 hour ago, turnon said:

Вроде учел всевозможные случаи, но может у кого есть на памяти какие-то безумные конфигурации регистров, которые не удалось обработать стандартными возможностями ПО и приходилось программировать для отображения пользователю

Что-то очень прмитивная схема описания регистров. 
Нет описателей битовых полей, объединений битовых полей, какой-то строки подсказки.
Потом есть регистры не привязанные к адресу, которые мапируют динамически.
Есть регистры доступные только по определенной хитрой функции типа 17-ой, и где чтение обязательно должно сопровождаться записью.
Нет признака только чтения или только записи. И т.д. и т.п.
Опиять же как описывать пароли которые должны быть в секрете. 
Короч , лучше не претендуйте на универсальность, а напишите что работаете с каким-то узким кругом моделей.  

Share this post


Link to post
Share on other sites
12 hours ago, AlexandrY said:

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

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

 

12 hours ago, AlexandrY said:

Есть регистры доступные только по определенной хитрой функции типа 17-ой, и где чтение обязательно должно сопровождаться записью.

А что будет если прочитать и не записать?

 

12 hours ago, AlexandrY said:

Нет признака только чтения или только записи. И т.д. и т.п.

Есть. Номера функций чтения и записи, можно привести только номер функции чтения, можно только записи, можно обе

        {
          "read":1,
          "write":5,
          "start":0x7530,
          "regs":[
            "ON;c"
          ]
        }

 

12 hours ago, AlexandrY said:

Короч , лучше не претендуйте на универсальность, а напишите что работаете с каким-то узким кругом моделей.  

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

Share this post


Link to post
Share on other sites
13 hours ago, AlexandrY said:

Нет описателей битовых полей, объединений битовых полей.

Первый раз про такое слышу. Это не из стандарта modbus? Очень хорошо бы пример или название прибора, а там в инструкции будет видно, как это работает.

Share this post


Link to post
Share on other sites
On 10/22/2020 at 3:10 PM, turnon said:

Первый раз про такое слышу. Это не из стандарта modbus? Очень хорошо бы пример или название прибора, а там в инструкции будет видно, как это работает.

16-битный регистр можно интерпретировать как набор битов, каждый из которых имеет свое значение, можно интерпретировать как структуру из полей по несколько бит. Пример прибора где такое используется: http://mx-omsk.ru/sites/default/files/products/files/РЭ_ДНК4_43.А4.pdf

Советую посмотреть как сделано в программе EAT Console (http://www.mikont.com/products/EAT-Console.html) Ее разработчики предусмотрели почти все.

Share this post


Link to post
Share on other sites
7 hours ago, AlexG said:

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

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

 

А вот есть какая-то замороченная адресация битовых полей:

 

Quote

BitAddr = RegAddr • 16 + п, где:

BitAddr— вычисляемый адрес битового поля:

RegAddr — адрес регистра, начиная с О, которому принадлежит битовое поле; п — номер битового поля (от 0 до 15) в пределах регистра с адресом RegAddr.

Например, пусть входной регистр для доступа к восьми каналам модуля дискретного ввода 1 .D1M717AnputStates (рис. 14) имеет адрес 144. Тогда адреса битовых полей (Discrete Input) для доступа к отдельным каналам будут иметь значения: 2304,2305, 2306,2311.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.