Страница 1 из 4 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 33

Тема: Общение с прибором с помощью скрипта

  1. #1
    Пользователь
    Регистрация
    02.11.2012
    Адрес
    г.Челябинск
    Сообщений
    107

    По умолчанию Общение с прибором с помощью скрипта

    Доброго времени суток, столкнулись с очередной проблемой в связи с переходом с MasterSCADA 1.3(+OPC Modbus Server) на 4D. В OPC сервере использовался прибор ВТЭ-2 К2 который не имеет встроенного протокола modbus, для считывания данных был написан скрипт на языке Lua, который формировал запрос, обрабатывал полученный ответ и распределял данные по заранее созданным тегам соответственно. Проблема в том, что в MasterSCADA 4D нет языка Lua и перенести готовый скрипт невозможно.

    Вот кусок скрипта на языке Lua в MasterOPC Modbus Server:
    Код:
    -- запрос текущего состояния командой 01h -- 
     table.insert(ArrCMD, 6); --длина блока 6 байт
     table.insert(ArrCMD, 225); --тип устройства
     table.insert(ArrCMD, 59);-- мл.байт серийного номера (для экземпляра #01595)
     table.insert(ArrCMD, 6);-- ст.байт серийного номера (для экземпляра #01595)
     table.insert(ArrCMD, 1); --код команды 
     table.insert(ArrCMD, CheckSum(ArrCMD)); --Контрольная сумма блока запроса
       
     ArrCMD_Mask={"byte", "byte", "byte", "byte", "byte", "byte"}; --маска отсылаемого запроса
     ArrCMD_DestMask={"byte", "byte", "int16:1:01", "byte", "float:1:0123", "int16:3:01", "float:5:0123", "byte:6"}; --маска для текущего состояния
     
     len,ArrDest=server.SendAndReceiveDataByMask(0,6,ArrCMD_Mask,ArrCMD,ArrCMD_DestMask,41);  
     --ожидаем 41 байт в ответ
    Есть ли аналогичные функции ( table.insert и server.SendAndReceiveDataByMask) в MasterSCADA 4D ?

    Может есть у кого примеры на С# или любом другом языке доступном в MasterSCADA 4D по общению с приборами через скрипты?

  2. #2

    По умолчанию

    А что мешает оставить MasterOPC Modbus Server?

  3. #3
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    12,325

    По умолчанию

    например ОС Linux сомневаюсь, что в данной версии тоже сохранен LUA

  4. #4
    Пользователь
    Регистрация
    02.11.2012
    Адрес
    г.Челябинск
    Сообщений
    107

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    А что мешает оставить MasterOPC Modbus Server?
    Это дополнительные расходы. Если MasterSCADA 4D позволяет обходится без отдельного OPC сервера, лучше переделать.

  5. #5
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    12,325

    По умолчанию

    Какая ОС и Лицензия MS4D ? там вроде не везде в базовом варианте есть поддержка C# (таблицу надо смотреть).
    Что собственно нужно (не знаток MS4D и вообще ее)
    1. Скорее всего вам надо писать Программу или FBD на C# судя по документации
    2. Как выполняется привязка COM портов в системе или вы в коде должны самостоятельно обрабатывать порты?
    3. Исходя из п.2 думать над кодом.

    В принципе, если там в системе все подготовлено для работы с портами, то код вполне будет примитивным. Отправить набор байт, получить ответ, распихать по каналам.

  6. #6
    Пользователь
    Регистрация
    02.11.2012
    Адрес
    г.Челябинск
    Сообщений
    107

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Какая ОС и Лицензия MS4D ? там вроде не везде в базовом варианте есть поддержка C# (таблицу надо смотреть).
    Что собственно нужно (не знаток MS4D и вообще ее)
    1. Скорее всего вам надо писать Программу или FBD на C# судя по документации
    2. Как выполняется привязка COM портов в системе или вы в коде должны самостоятельно обрабатывать порты?
    3. Исходя из п.2 думать над кодом.

    В принципе, если там в системе все подготовлено для работы с портами, то код вполне будет примитивным. Отправить набор байт, получить ответ, распихать по каналам.

    ОС Windows/ MasterSCADA 4D. Расширенная локальная исполнительная система на 100 внешних точек ввода-вывода.
    В наличии имеется документация к прибору с описанием протокола.
    Для общения используется преобразователь АС4 (RS485)/ в SCADA указываем только параметры COM порта.

    Вот весь код:

    Код:
     -- функция,выполняющаяся перед чтением тегов
    function OnBeforeReading() 
    
     local len; -- количество полученных байт 
     local startTime; 
     local ArrCMD={}; --массив под запрос текущих параметров, Было-send2
     local ChErr; --error'ы
     local ArrCMD_Mask={}; --маска отсылаемого запроса
     local ArrCMD_DestMask={}; --маска для текущего состояния
     local ArrDest={};
     
     -- задержка чтобы прибор проплевался и стал принимать команды 
     -- Т.е. код нивелирования последствий предшествующего обмена данными в сети по modbus-протоколу 
     startTime=os.time()   
     while true do if os.time()>startTime+2 then break; end; end; 
     --
    
    -- запрос текущего состояния командой 01h -- 
     table.insert(ArrCMD, 6); --длина блока 6 байт
     table.insert(ArrCMD, 225); --тип устройства
     table.insert(ArrCMD, 59);-- мл.байт серийного номера (для экземпляра #01595)
     table.insert(ArrCMD, 6);-- ст.байт серийного номера (для экземпляра #01595)
     table.insert(ArrCMD, 1); --код команды 
     table.insert(ArrCMD, CheckSum(ArrCMD)); --Контрольная сумма блока запроса
       
     ArrCMD_Mask={"byte", "byte", "byte", "byte", "byte", "byte"}; --маска отсылаемого запроса
     ArrCMD_DestMask={"byte", "byte", "int16:1:01", "byte", "float:1:0123", "int16:3:01", "float:5:0123", "byte:6"}; --маска для текущего состояния
     
     len,ArrDest=server.SendAndReceiveDataByMask(0,6,ArrCMD_Mask,ArrCMD,ArrCMD_DestMask,41);  
     --ожидаем 41 байт в ответ
    
     if len==41 then
        server.Message("Запрос выполнен успешно. Получено 41 байт"); 
        server.WriteTag("COM-порт.ВТЭ-2 K2.error", ArrDest[18], OPC_QUALITY_GOOD);
        ChErr=CheckErrors(ArrDest[18]); --проверка на наличие ошибок от прибора
         
        --перерасчеты 
        local temp = ArrDest[5] * 1162.790700; 
        ArrDest[5] = temp;
        ArrDest[6]=ArrDest[6]/100; 
        ArrDest[7]=ArrDest[7]/100; 
        
        --присваиваем тегам считанные с прибора значения
        server.WriteTag("COM-порт.ВТЭ-2 K2.ТеплСеть.ТеплЭнВсего", ArrDest[5], ChErr);   -- Тепловая энергия
        server.WriteTag("COM-порт.ВТЭ-2 K2.ТеплСеть.Тпод", ArrDest[6], ChErr);          -- Температура в подающем трубопроводе
        server.WriteTag("COM-порт.ВТЭ-2 K2.ТеплСеть.Тобр", ArrDest[7], ChErr);          -- Температура в обратном трубопроводе
        server.WriteTag("COM-порт.ВТЭ-2 K2.ТеплСеть.РасхВодВсего", ArrDest[9], ChErr);  -- Объем по первому расходомеру
        server.WriteTag("COM-порт.ВТЭ-2 K2.ТеплСеть.ЭлЭнВсего", ArrDest[13], ChErr);    -- Электроэнергия по первому тарифу
       
     else server.Message("ОШИБКА ЧТЕНИЯ: Байт получено: ", len ," -- nil в первом либо пришло меньше 41 байт");           
     end; 
    
     --эта пауза чтобю проплевались остальные приборы, идущие в очереди после ВТЭ-2         
     StartTime=os.time()   
     while true do if os.time()>startTime+2 then break; end; end;  
        
    end
    
    function CheckErrors(error)
      local q;
      if error==0 then q=OPC_QUALITY_GOOD
       else
        --надо побитово анализировать код ошибки 
        if bit.BitFromData(error, 0) then q=OPC_QUALITY_UNCERTAIN end; --отсутствие расхода по счетчику воды...
        if bit.BitFromData(error, 1) then q=OPC_QUALITY_SENSOR_FAILURE end; --температу 1или2 термопреобразователя больше 150 или меньше 0
        if bit.BitFromData(error, 2) then q=OPC_QUALITY_SENSOR_FAILURE end; --обратное подключение термопреобразователей 1и2
        if bit.BitFromData(error, 3) then q=OPC_QUALITY_DEVICE_FAILURE end; --ошибка системы измерения температур
        if bit.BitFromData(error, 4) then q=OPC_QUALITY_DEVICE_FAILURE end; --счетчик часов наработки превысил 4,5года
        if bit.BitFromData(error, 5) then q=OPC_QUALITY_DEVICE_FAILURE end; --необходимость замены батарейки
        if bit.BitFromData(error, 6) then q=OPC_QUALITY_DEVICE_FAILURE end; --ошибка памяти EEPROM
        if bit.BitFromData(error, 7) then q=OPC_QUALITY_COMM_FAILURE end; --энергия в открытой системе отрицательна   
       end;
      return q;
    end 
    
    function CheckSum(sendtbl)                 
      local cs, j;  
      cs=0;
      for j=1,table.maxn(sendtbl) do  --однобайтовое суммирование
      if (cs+sendtbl[j])>255 then cs=cs+sendtbl[j]-256
       else cs=cs+sendtbl[j]; end; 
      end;
      cs=256-cs; -- инверсией байта дополнение 
      return cs;
     end;

  7. #7
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    12,325

    По умолчанию

    ну? приведите это к коду C# построчно для начала.
    local len - int len = 0;
    local StartTime - это че? таймер? какой? у меня есть код для C# таймера Ton, ну можно доработать и Tof и Tp если надо. Это отдельные классы будут.
    local ArrCMD={}; - байтовый? byte[] ArrCmd = new byte[x]; если знаете сколько байт.
    local ChErr; - это что? байт, целочисленное?

    Ну и так далее. Просто распишите словами что есть что.
    Заполнение байт может быть по разному, например ArrCMD[0] = 6; ArrCMD[1] = 255;
    Если никогда не меняется то можно в объявлении byte[] ArrCmd = new byte[] {6, 255, 59, ы ты.ды };

    По сути вам больше привести к синтаксису C# нужно ваш же код. Ну и правильно задать переменные.

    Ну судя по этому local temp = ArrDest[5] * 1162.790700; у вас там непонятно массив float что ли или все таки там байты? тогда такие комбинации типа ArrDest[7]=ArrDest[7]/100 не прокатят
    Последний раз редактировалось melky; 27.03.2025 в 11:32.

  8. #8

    По умолчанию

    Цитата Сообщение от denprox Посмотреть сообщение
    Это дополнительные расходы. Если MasterSCADA 4D позволяет обходится без отдельного OPC сервера, лучше переделать.
    Тут не соглашусь... Какие расходы, вы меняете только скаду, а орс сервер оставляете старый. А если понадобится интегрировать другое оборудование, которое только орс поймет... Ладно, это лирическое отступление, выше я смотрю уже добрались до сути программной реализации...

  9. #9
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    12,325

    По умолчанию

    bit.BitFromData - GetBit у меня тоже есть на C#, если надо. В общем приведите все, что вы понимаете, напишите то, что вам не хватает.

  10. #10
    Пользователь
    Регистрация
    02.11.2012
    Адрес
    г.Челябинск
    Сообщений
    107

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    ну? приведите это к коду C# построчно для начала.
    local len - int len = 0;
    local StartTime - это че? таймер? какой? у меня есть код для C# таймера Ton, ну можно доработать и Tof и Tp если надо. Это отдельные классы будут.
    local ArrCMD={}; - байтовый? byte[] ArrCmd = new byte[x]; если знаете сколько байт.
    local ChErr; - это что? байт, целочисленное?

    Ну и так далее. Просто распишите словами что есть что.
    Заполнение байт может быть по разному, например ArrCMD[0] = 6; ArrCMD[1] = 255;
    Если никогда не меняется то можно в объявлении byte[] ArrCmd = new byte[] {6, 255, 59, ы ты.ды };

    По сути вам больше привести к синтаксису C# нужно ваш же код. Ну и правильно задать переменные.

    Ну судя по этому local temp = ArrDest[5] * 1162.790700; у вас там непонятно массив float что ли или все таки там байты? тогда такие комбинации типа ArrDest[7]=ArrDest[7]/100 не прокатят
    Основная проблема не в коде. Перевести на C# весь код не сложно, вопрос был изначально к определенному участку, где используются функции table.insert и server.SendAndReceiveDataByMask. Если table.insert это обычный массив, то к нему тоже нет вопросов. Остается главное, как отправить запрос в прибор и получить ответ.
    Т.е. нужен аналог функции server.SendAndReceiveDataByMask в рамках MasterSCADA 4D на языке C#.

Страница 1 из 4 123 ... ПоследняяПоследняя

Похожие темы

  1. Ответов: 0
    Последнее сообщение: 06.04.2022, 07:51
  2. Ответов: 13
    Последнее сообщение: 05.07.2019, 11:34
  3. Ответов: 4
    Последнее сообщение: 05.06.2017, 20:40
  4. Ответов: 10
    Последнее сообщение: 22.03.2017, 08:57
  5. Общение с монитором Com-порта
    от Makin_Pavel в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 06.03.2017, 10:11

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •