Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: Протокол обмена Тензо-М

  1. #1

    По умолчанию Протокол обмена Тензо-М

    Добрый день!

    Приобрели пару преобразователей весоизмерительных, фирмы Тензо-М, но при покупке не обратили внимание что данные преобразователи не имеют возможности обмена по протоколу Modbus. Возникла сложность в настройке обмена между программируемым контроллером и преобразователем, в частности не могу настроить обмен информацией между приборами.
    Пример настройки протокола был взят с темы на форуме http://www.owen.ru/forum/showthread....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
    Вот пример программы для опроса преобразователя, команда подается на считывание серийного номера прибора
    Но в ответ ничего не приходит
    Последний раз редактировалось imaks; 23.08.2013 в 07:46.

  2. #2
    Пользователь
    Регистрация
    03.03.2008
    Адрес
    Новосибирск
    Сообщений
    238

    По умолчанию

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

  3. #3

    По умолчанию

    На основе все тех же примеров получилась вот такая программа опроса тензодатчика (Вес нетто), вроде работает, но пока в боевом режиме опробовать не получилось.
    Столкнулся с такой проблемой, когда командой 2 обнуляю показания датчика, при следующих опроса значения в кодесисе "зависают" на последнем до обнуления командой...
    Возможно, что при подключении на объект проблема исчезнет, но хотелось бы перестраховаться.
    Вложения Вложения
    • Тип файла: rar Tenzo.rar (31.0 Кб, Просмотров: 442)

  4. #4

    По умолчанию

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

  5. #5

    По умолчанию

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

  6. #6

    По умолчанию

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

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

  7. #7

    По умолчанию

    Функция CRC_GEN из OSCAT Basic.lib http://www.oscat.de/

  8. #8

    По умолчанию

    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    Функция 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;
    }

  9. #9
    Пользователь
    Регистрация
    11.05.2012
    Адрес
    Москва
    Сообщений
    66

    По умолчанию

    Раз уж тема Тензо-м уже есть подскажите никто не писал код в 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

  10. #10

    По умолчанию

    вот кусок для истинных ценителей 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;

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Протокол обмена Owen logic
    от Atman в разделе Программируемые реле
    Ответов: 238
    Последнее сообщение: 22.12.2014, 15:11
  2. МСД100 (Протокол обмена)
    от rs485 в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 15.12.2011, 12:47
  3. Протокол обмена для счётчика Альфа?
    от SVVSVA в разделе Трёп (Курилка)
    Ответов: 1
    Последнее сообщение: 09.09.2011, 23:35
  4. протокол обмена овен
    от Михайлов Сергей в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 08.02.2011, 17:06
  5. протокол обмена счетчика си8
    от Юрий Поляков в разделе Сервисное ПО
    Ответов: 2
    Последнее сообщение: 01.07.2010, 15:03

Ваши права

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