Тензод200 — различия между версиями

Материал из WebHMI Wiki
Перейти к: навигация, поиск
(Новая страница: «right Работа WebHMI с тензометрическим контроллером Тензод200 легко реализу…»)
 
 
(не показано 6 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
[[Файл:Tenzod200.jpg|200px|right]]
 
[[Файл:Tenzod200.jpg|200px|right]]
Работа WebHMI с тензометрическим контроллером Тензод200 легко реализуется благодаря возможности использования пользовательских протоколов на языке Lua. Прибор ТЕНЗОД200 имеет открытый символьный протокол с адресацией устройств в сети, имеет несколько режимов работы со встроенными портами RS-232/485/ИРПС, такими как выдача результатов измерения в порт (режим терминала), режим печати  и др. Для опроса устройства по RS-485 необходимо отключить в приборе функции выдачи в порт данных (параметр 8026)
+
<p>Работа WebHMI с тензометрическим контроллером Тензод200 легко реализуется благодаря возможности использования [http://wiki.webhmi.com.ua/index.php/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B пользовательских протоколов] на встроенном языке скриптов.</p>
Пример функций поддержки протокола в ТЕНЗОД200 на языке скриптов :
+
Прибор ТЕНЗОД200 имеет открытый символьный протокол с адресацией устройств в сети, имеет несколько режимов работы со встроенными портами RS-232/485/ИРПС, такими как выдача результатов измерения в порт (режим терминала), режим печати  и др.  
 +
Для опроса устройства по RS-485 необходимо отключить в приборе функции выдачи в порт данных (параметр 8026). Основные настройки прибора приведены ниже:
 +
 
 +
*'''8028''' = 83, разрешить чтение и запись, не отвечать на запрос ошибки
 +
*'''8029''' = 96..11 скорость обмена [9600 - 115200] по первым 2-м цифрам скорости
 +
*'''802А''' = адрес прибора в сети 
 +
*'''8001''' = положение 10-й точки в результате 
 +
*'''8036''' = 21, подсвечивать прием / отправку пакетов светодиодами (для наладки связи )
 +
*'''8026''' = 00 не выводить в порт данные в режиме терминала
 +
*'''8198''' = начальный адрес регистров с данными, рекомендуется вычитывать 8 байт, последний байт с адресом 819F содержит знак числа (80 - для отрицательного 
 +
*количество бит 8, 2 стоповых бита, без четности
 +
*в некоторых версиях прибора могут меняться местами линии А (Data-) и В (Data+)
 +
Ответ прибора с адресом 41h (в запросе используется символ "А")
 +
< >< ># 0A WM 8198 8 45 23 01 00 00 00 00 80 $06BE<CR><LF>
 +
< > - лидирующие пробелы , <CR><LF> - символы возврата каретки и перевода строки. 
 +
<br>
 +
Пример функций поддержки протокола ТЕНЗОД200 на языке Lua:
 +
 
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
function createDevices () -- функция создания регистров  
 
function createDevices () -- функция создания регистров  
   addDevice({name = "H", base = 16}); -- в документации регистры в шестнадацт. системе  
+
   addDevice({name = "H", base = 16}); -- в документации регистры в шестнадацтиричной системе  
 
end
 
end
 +
 
local errorCount = 0; -- error counter
 
local errorCount = 0; -- error counter
 +
local request_str = "#{ADDR}0 RM 8198 8 $0{CRC}\r\n" -- шаблон строки, длина всегда 8, меняем только адрес и контрольную сумму
  
    -- дшаблон строки, длина всегда 8,  меняем только адрес и к. сумму
 
  
local request_str = "#{ADDR}0 RM 8198 8 $0{CRC}\r\n"
+
function readRegister (reg, device, unitId) --ФУНКЦИЯ ЧТЕНИЯ
 
+
                                              --ФУНКЦИЯ ЧТЕНИЯ
+
function readRegister (reg, device, unitId)
+
   
+
 
     --  адрес в сети подставить из переданного параметра unitId
 
     --  адрес в сети подставить из переданного параметра unitId
   
 
 
     adr_char = string.char( tonumber(unitId .. "",16) ) ;  
 
     adr_char = string.char( tonumber(unitId .. "",16) ) ;  
     request_str = string.gsub(request_str, "#{ADDR}", "#"..adr_char, 1);
+
     request_str = string.gsub(request_str, "#{ADDR}", "#" .. adr_char, 1);
 
      
 
      
 
     -- вычислить контрольную сумму, c 2 по 14 символы  
 
     -- вычислить контрольную сумму, c 2 по 14 символы  
   
 
 
     local crc_2 =0;
 
     local crc_2 =0;
 
     for j=2, 14 do
 
     for j=2, 14 do
Строка 28: Строка 40:
 
     end
 
     end
 
      
 
      
      -- преобразовать в число 16-ое в виде строки
+
     crc_str_to = string.format("%X",crc_2); -- преобразовать в число 16-ое в виде строки
     crc_str_to = string.format("%X",crc_2);
+
     request_str = string.gsub(request_str, "{CRC}", crc_str_to); -- вставить контрольную сумму в строку
   
+
 
      -- вставить к. сумму в строку
+
     local res = sendString(request_str); --  отправка запроса
     request_str = string.gsub(request_str, "{CRC}", crc_str_to);
+
   
+
    -- отправка строки запроса
+
   
+
     local res = sendString(request_str);  
+
 
     if (res == false) then
 
     if (res == false) then
 
         DEBUG("Can't send bytes");
 
         DEBUG("Can't send bytes");
 
         return false;
 
         return false;
 
     end
 
     end
 
 
  -- прием ответа
 
 
    
 
    
  local response = readString(48);  
+
    local response = readString(48); -- прием ответа
  if (response == false) then
+
    if (response == false) then
 
       ERROR("Can't read response") ;
 
       ERROR("Can't read response") ;
 
       return false;
 
       return false;
  end
+
    end
  if (#response < 48) then  
+
    if (#response < 48) then  
       ERROR("packet shorter "..tostring(#response)) ;
+
       ERROR("packet shorter " .. tostring(#response)) ;
 
       return false;
 
       return false;
  end
+
    end
 
+
  -- посчитать контрольную сумму 4..40
+
 
    
 
    
  local crc_3= 0;
+
    -- посчитать контрольную сумму 4..40
  for j=4, 40 do
+
    local crc_3= 0;
 +
    for j=4, 40 do
 
         crc_3 = crc_3 + response:byte(j);  
 
         crc_3 = crc_3 + response:byte(j);  
 
         j = j + 1;
 
         j = j + 1;
 
     end
 
     end
 
      
 
      
    -- получить ее в виде строки
+
     crc_str_reply = string.format("%X",crc_3); -- получить ее в виде строки
     crc_str_reply = string.format("%X",crc_3);  
+
 
    
 
    
  -- взять к. сумму из ответа
+
    -- взять к. сумму из ответа
  __,__, res_crc = string.find(response,"($0%w%w%w)");  
+
    __,__,res_crc = string.find(response,"($0%w%w%w)");  
 
+
   
  -- последние 3 цифры
+
    res_crc = string.sub (res_crc,3); -- последние 3 цифры
  res_crc = string.sub (res_crc,3);  
+
   
 
+
    -- обработка ошибки к. суммы  
  -- обработка ошибки к. суммы  
+
    if (res_crc ~= crc_str_reply) then
  if (res_crc ~= crc_str_reply) then
+
        errorCount = errorCount + 1;
            errorCount = errorCount + 1;
+
 
         if (errorCount > 3) then
 
         if (errorCount > 3) then
 
           closeConnection();
 
           closeConnection();
 
           errorCount = 0;
 
           errorCount = 0;
 
         end
 
         end
       DEBUG("CRC not Ok "..res_crc.." vs."..crc_str_reply);
+
       DEBUG("Wrong CRC. " .. res_crc .. " vs " .. crc_str_reply);
 
       return false;
 
       return false;
 
     end
 
     end
 
    
 
    
  -- найти позицию "8" чтобы взять ближайшие к ней цифры с значением
+
    local result_start_i, res_end_i = string.find(response," 8 "); -- найти позицию "8" чтобы взять ближайшие к ней цифры с значением
 
+
    local result_sub = string.sub(response, res_end_i, res_end_i+11); -- взять значения  
  local result_start_i, res_end_i = string.find(response," 8 ");  
+
    local result_sign = string.sub(response, res_end_i+22, res_end_i+23); -- взять знак числа  
  local result_sub = string.sub(response, res_end_i, res_end_i+11); -- взять значения  
+
 
+
  local result_sign = string.sub(response, res_end_i+22, res_end_i+23); -- взять знак числа  
+
 
        
 
        
  -- найти пары чисел с пробелами используя свойство ф. sring.find "захвата" нескольких значений с помощью ()   
+
    -- найти пары чисел с пробелами используя свойство ф. sring.find "захвата" нескольких значений с помощью ()   
  local p1,p2,p3,p4 = "","","","";
+
    local p1,p2,p3,p4 = "","","","";
  __,__, p1,p2,p3,p4 = string.find(result_sub,"( %d%d)( %d%d)( %d%d)( %d%d)");  
+
    __,__, p1,p2,p3,p4 = string.find(result_sub,"( %d%d)( %d%d)( %d%d)( %d%d)");  
       -- перевернуть строку
+
        
  result_sub = p4..p3..p2..p1;  
+
    result_sub = p4..p3..p2..p1; -- перевернуть строку
  -- убрать пробелы
+
    result_sub = string.gsub(result_sub, " ",""); -- убрать пробелы
  result_sub = string.gsub(result_sub, " ","");  
+
   
 +
    local value_out = tonumber(result_sub); -- преобр. в число
 
    
 
    
  -- преобр. в число
+
    if (result_sign == "80") then  -- вернуть из функции полученное число со знаком
  value_out = tonumber(result_sub);
+
        value_out = (0 - value_out) ;
 
+
    end
  -- вернуть из функции полученное число со знаком
+
   
  if (result_sign == "80") then
+
    return value_out; -- возвращение результата  
      value_out = (0 - value_out) ;
+
  end
+
  -- возвращение результата  
+
  return value_out;
+
 
end
 
end
  
 
function writeRegister ()
 
function writeRegister ()
 
   -- Add your code here
 
   -- Add your code here
 +
  return false;
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>

Текущая версия на 16:19, 1 февраля 2016

Tenzod200.jpg

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

Прибор ТЕНЗОД200 имеет открытый символьный протокол с адресацией устройств в сети, имеет несколько режимов работы со встроенными портами RS-232/485/ИРПС, такими как выдача результатов измерения в порт (режим терминала), режим печати и др. Для опроса устройства по RS-485 необходимо отключить в приборе функции выдачи в порт данных (параметр 8026). Основные настройки прибора приведены ниже:

  • 8028 = 83, разрешить чтение и запись, не отвечать на запрос ошибки
  • 8029 = 96..11 скорость обмена [9600 - 115200] по первым 2-м цифрам скорости
  • 802А = адрес прибора в сети
  • 8001 = положение 10-й точки в результате
  • 8036 = 21, подсвечивать прием / отправку пакетов светодиодами (для наладки связи )
  • 8026 = 00 не выводить в порт данные в режиме терминала
  • 8198 = начальный адрес регистров с данными, рекомендуется вычитывать 8 байт, последний байт с адресом 819F содержит знак числа (80 - для отрицательного
  • количество бит 8, 2 стоповых бита, без четности
  • в некоторых версиях прибора могут меняться местами линии А (Data-) и В (Data+)

Ответ прибора с адресом 41h (в запросе используется символ "А") < >< ># 0A WM 8198 8 45 23 01 00 00 00 00 80 $06BE<CR><LF> < > - лидирующие пробелы , <CR><LF> - символы возврата каретки и перевода строки.
Пример функций поддержки протокола ТЕНЗОД200 на языке Lua:

function createDevices () -- функция создания регистров 
  addDevice({name = "H", base = 16}); -- в документации регистры в шестнадацтиричной системе 
end

local errorCount = 0; -- error counter
local request_str = "#{ADDR}0 RM 8198 8 $0{CRC}\r\n" -- шаблон строки, длина всегда 8, меняем только адрес и контрольную сумму


function readRegister (reg, device, unitId) --ФУНКЦИЯ ЧТЕНИЯ
    --  адрес в сети подставить из переданного параметра unitId
    adr_char = string.char( tonumber(unitId .. "",16) ) ; 
    request_str = string.gsub(request_str, "#{ADDR}", "#" .. adr_char, 1);
    
    -- вычислить контрольную сумму, c 2 по 14 символы 
    local crc_2 =0;
    for j=2, 14 do
        crc_2 = crc_2 + request_str:byte(j); -- посчитать к. сумму, она зависит от адреса
        j = j + 1;
    end
    
    crc_str_to = string.format("%X",crc_2); -- преобразовать в число 16-ое в виде строки 
    request_str = string.gsub(request_str, "{CRC}", crc_str_to); -- вставить контрольную сумму в строку 

    local res = sendString(request_str); --  отправка запроса 
    if (res == false) then
        DEBUG("Can't send bytes");
        return false;
    end
   
    local response = readString(48); -- прием ответа
    if (response == false) then
       ERROR("Can't read response") ;
       return false;
    end
    if (#response < 48) then 
       ERROR("packet shorter " .. tostring(#response)) ;
       return false;
    end
   
    -- посчитать контрольную сумму 4..40 
    local crc_3= 0;
    for j=4, 40 do
        crc_3 = crc_3 + response:byte(j); 
        j = j + 1;
    end
    
    crc_str_reply = string.format("%X",crc_3); -- получить ее в виде строки 
   
    -- взять к. сумму из ответа
    __,__,res_crc = string.find(response,"($0%w%w%w)"); 
    
    res_crc = string.sub (res_crc,3); -- последние 3 цифры
    
    -- обработка ошибки к. суммы 
    if (res_crc ~= crc_str_reply) then
        errorCount = errorCount + 1;
        if (errorCount > 3) then
          closeConnection();
          errorCount = 0;
        end
       DEBUG("Wrong CRC. " .. res_crc .. " vs " .. crc_str_reply);
       return false;
    end
   
    local result_start_i, res_end_i = string.find(response," 8 ");  -- найти позицию "8" чтобы взять ближайшие к ней цифры с значением 
    local result_sub = string.sub(response, res_end_i, res_end_i+11); -- взять значения 
    local result_sign = string.sub(response, res_end_i+22, res_end_i+23); -- взять знак числа 
       
    -- найти пары чисел с пробелами используя свойство ф. sring.find "захвата" нескольких значений с помощью ()  
    local p1,p2,p3,p4 = "","","","";
    __,__, p1,p2,p3,p4 = string.find(result_sub,"( %d%d)( %d%d)( %d%d)( %d%d)"); 
      
    result_sub = p4..p3..p2..p1;  -- перевернуть строку 
    result_sub = string.gsub(result_sub, " ",""); -- убрать пробелы 
    
    local value_out = tonumber(result_sub); -- преобр. в число
   
    if (result_sign == "80") then  -- вернуть из функции полученное число со знаком
        value_out = (0 - value_out) ;
    end
    
    return value_out; -- возвращение результата 
end

function writeRegister ()
  -- Add your code here
  return false;
end