PDA

Просмотр полной версии : Протокол обмена Тензо-М



imaks
23.08.2013, 05:55
Добрый день!

Приобрели пару преобразователей весоизмерительных, фирмы Тензо-М, но при покупке не обратили внимание что данные преобразователи не имеют возможности обмена по протоколу Modbus. Возникла сложность в настройке обмена между программируемым контроллером и преобразователем, в частности не могу настроить обмен информацией между приборами.
Пример настройки протокола был взят с темы на форуме http://www.owen.ru/forum/showthread.php?t=13033&highlight=%D2%E5%ED%E7%EE
Но должного результата это не дало.
Суть задачи такова, необходимо просто опрашивать преобразователь, в ответ получать значение веса.
Порт инициализирован, а вот дальше не могу получить ответ на команду, скорее всего либо задание команды кривое, потому что в кодесисе в проекте имя задающей команды выглядит Я$01АУяя$, либо еще в чем то проблема...

Подскажите в какую сторону копать, либо дайте простенький пример обмена контроллера и устройства по нестандартным протоколам, а то те, которые есть в FAQе уж больно замудренные.




IF COM_SERVICE1.ready=FALSE THEN
(*
(com_number):
0 - RS-485
1 - RS-232
4 - RS-232 DEBUG
*)
com_num:=0;

Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=1;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;

COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
com_ready:=FALSE;
ELSE
COM_SERVICE1.Enable:=FALSE;
com_ready:=TRUE;
END_IF



IF com_ready=TRUE THEN
i:=i+1;
END_IF


ton1(In:=start_tmr,pt:=T#2s);
start_tmr:=TRUE;
tr1(clk:=ton1.Q);
IF tr1.Q THEN

snd_str:='$FF$01$A1$FF$FF ';

SysComWrite(com_num,ADR(snd_str),LEN(snd_str),0);

SZ2:=SysComRead(com_num,ADR(CM2_READ_BUF),20,6);

END_IF


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

kgsh82
23.08.2013, 21:58
Зачем переменная i? Разберитесь с функционалом ton1 и tr1. И главное - записываете и считывайте в разных циклах. И внимательно посмотрите как правильно записывать и считывать - в тех же примерах

imaks
26.08.2013, 05:23
На основе все тех же примеров получилась вот такая программа опроса тензодатчика (Вес нетто), вроде работает, но пока в боевом режиме опробовать не получилось.
Столкнулся с такой проблемой, когда командой 2 обнуляю показания датчика, при следующих опроса значения в кодесисе "зависают" на последнем до обнуления командой...
Возможно, что при подключении на объект проблема исчезнет, но хотелось бы перестраховаться.

imaks
26.08.2013, 07:04
snd_str:='$FF$02$C2$8F$FF$FF';
Команда опроса преобразователя
FF - начало
02 - номер устройства
C2 - Сама команда
FF$FF - конец
А вот что значит 8F? в описании к устройству на этом месте контрольная сумма, но я не могу понять каким образом она высчитывалась? либо ее необходимо рассчитывать в ручную? Тогда подскажите алгоритм, пожалуйста

RV9WFJ
26.08.2013, 19:31
Начнем с того что нет ли ошибки тут:

Settings.byStopBits:=1; "byStopBits:BYTE; 0 = один стоп бит, 1=полтора, 2=два"
попробуй SZ2:=SysComRead(com_num,ADR(CM2_READ_BUF),20,0); поставить
И самое главное разнести чтение и передачу по циклам с помощью оператора CASE

imaks
27.08.2013, 02:14
В плане обмена уже вопрос решен, вес с преобразователя считывается, как и записывается команда на обнуление с контроллера
Теперь вопрос возник именно в задание команды, в примере команда задавалась snd_str:='$FF$02$C2$8F$FF$FF';, где как я уже описал все переменные известны, кроме 8F.
В описании к протоколу Тензо-М на данном месте числится CRC контрольная сумма, но вот как ее посчитать я не знаю.

Про Стопбит да, мой косяк, но в прошивке Tenzo которую я скинул выше, обмен уже настроен, остался только вопрос не решенный с контрольной суммой.
Пока данная команда мне подходит, но если придется использовать другую команду, вот тогда и возникнет проблема с CRC.

RV9WFJ
27.08.2013, 10:06
Функция CRC_GEN из OSCAT Basic.lib http://www.oscat.de/

Алексей Дмитриев
27.08.2013, 16:46
Функция CRC_GEN из OSCAT Basic.lib http://www.oscat.de/
Вот на С:
Пример программы расчёта CRC8 на языке C
/*
Name : CRC-8
Poly : 0x31 x^8 + x^5 + x^4 + 1
Init : 0xFF
Revert: false
XorOut: 0x00
Check : 0xF7 ("123456789")
MaxLen: 15 байт(127 бит) - обнаружение
одинарных, двойных, тройных и всех нечетных ошибок
*/
unsigned char Crc8(unsigned char *pcBlock, unsigned char len)
{
unsigned char crc = 0xFF;
unsigned char i;

while (len--)
{
crc ^= *pcBlock++;

for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
}

return crc;
}

Андрей007
19.08.2015, 22:52
Раз уж тема Тензо-м уже есть подскажите никто не писал код в CoDeSys 2.3 для обмена по протоколу Тензо-м (нестандартному)?
Особенно интересно не написал ли кто кода для расчёта CRC по предложенному алгоритму?

И сразу попрошу, если кто-нибудь может, переведите на ST вот этот код:
(Ибо я ни бельмеса не понимаю в этой арабской вязи)

Ниже приведен пример формирования CRC в виде ассемблерной вставки для C++
BYTE CDeviceTestDlg::CRCMaker(BYTE b_input, BYTE b_CRC)
{
__asm
{
mov al,b_input
mov ah,b_CRC
mov cx,8
mod1: rol al,1
rcl ah,1
jnc mod2
xor ah,69h
mod2: dec cx
jnz mod1
mov b_CRC,ah
}
return b_CRC;
При формировании CRC используется примитивный неприводимый порождающий полином в 8-й степени
P(X)-101101001b (младшая часть 69h). На передающей стороне в конце массива используется нулевой байт (00h).
Подставляя в переменную b_input байты массива, включая нулевой байт, вычисляется CRC код с помощью
подпрограммы CRCMaker. При передаче массива нулевой байт заменяется вычисленным байтом CRC. На
принимающей стороне вычисляют CRC, подставляя в b_input байты принятого массива, включая принятый CRC
код. Если вычисленный CRC будет равен нулю, то массив принят правильно. Вначале приема/передачи перед
вычислением CRC в переменную b_CRC записывается ноль. По вставленному и выброшенному FEh CRC не
вычисляется.

ссылка на документ:
http://www.tenso-m.ru/pdf/tv19protocol.pdf

upversus
06.02.2017, 19:42
вот кусок для истинных ценителей DELPHI

function crc8_69(datapull:array of byte;offset:byte):byte;
var
crcCode:byte;

begin

for I := offset to Length(datapull) do
begin
Data:=datapull[i];

asm
mov al,data
mov ah,crcCode
mov cx,8
@m1:rol al,1
rcl ah,1
jnc @m2
xor ah,69h
@m2:dec cx
jnz @m1
mov crcCode,ah
end;

end;
Result:=crcCode;

end;

uJluac
17.04.2017, 17:01
Привет всем. у меня проблема. по протоколу темзо-М работает ток на 2 адресе.
никак не могу понять где ж подвох

Kirin_j
25.12.2019, 10:00
Добрый день. Товарищи, выручайте. У меня возникла проблема.
В общем, подключаю ПЛК100 к.м. к Тензодатчику весового полигона. Программа написана хорошо (пакет данных приходит такой же как и заведанно протоколом обмена Тензо-М). Нужно вывести значение весов на комп, но для этого нужен алгоритм расчета CRC (контрольной суммы).
При таком пакете данных весы показывают значение 0 :
[0]=255
[1]=2
[2]=195
[3]=0
[4]=0
[5]=0
[6]=16
[7]=74
[8]=255
[9]=255
Товарищи, выручайте.

Dmitriy422
25.12.2019, 19:36
Возможно поможет.

tomas111
06.05.2021, 19:05
Возможно поможет.

Приветствую. Это рабочий код? Был проверен?

Dmitriy422
06.05.2021, 23:24
Это набросок (пояснение). Функция - рабочая.

tomas111
11.05.2021, 15:34
Это набросок (пояснение). Функция - рабочая.

Спасибо. Я попробую!

Dmitriy422
12.05.2021, 22:23
Вынул из черновика, поправил. Может так понятней будет.