Тензод200 — различия между версиями
(Новая страница: «right Работа WebHMI с тензометрическим контроллером Тензод200 легко реализу…») |
|||
(не показано 6 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
[[Файл:Tenzod200.jpg|200px|right]] | [[Файл:Tenzod200.jpg|200px|right]] | ||
− | Работа WebHMI с тензометрическим контроллером Тензод200 легко реализуется благодаря возможности использования пользовательских протоколов на языке | + | <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 имеет открытый символьный протокол с адресацией устройств в сети, имеет несколько режимов работы со встроенными портами 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, меняем только адрес и контрольную сумму | ||
− | |||
− | + | 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 | ||
− | + | 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); -- прием ответа | |
− | + | if (response == false) then | |
ERROR("Can't read response") ; | ERROR("Can't read response") ; | ||
return false; | return false; | ||
− | + | end | |
− | + | if (#response < 48) then | |
− | ERROR("packet shorter "..tostring(#response)) ; | + | ERROR("packet shorter " .. tostring(#response)) ; |
return false; | return false; | ||
− | + | end | |
− | + | ||
− | + | ||
− | + | -- посчитать контрольную сумму 4..40 | |
− | + | 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.sub (res_crc,3); -- последние 3 цифры | |
− | + | ||
− | + | -- обработка ошибки к. суммы | |
− | + | if (res_crc ~= crc_str_reply) then | |
− | + | errorCount = errorCount + 1; | |
− | + | ||
if (errorCount > 3) then | if (errorCount > 3) then | ||
closeConnection(); | closeConnection(); | ||
errorCount = 0; | errorCount = 0; | ||
end | end | ||
− | DEBUG("CRC | + | DEBUG("Wrong CRC. " .. res_crc .. " vs " .. crc_str_reply); |
return false; | return false; | ||
end | 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 | end | ||
function writeRegister () | function writeRegister () | ||
-- Add your code here | -- Add your code here | ||
+ | return false; | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> |
Текущая версия на 16:19, 1 февраля 2016
Работа 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