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

Тема: Свободное чтение RS-485

  1. #1

    Question Свободное чтение RS-485

    Добрый день всем!
    Имею устройство, которое 24/7 без смс и регистрации отправляет по 485 портику на скорости света 115200 посылку вида:

    байт FF
    байт 03 (типа его адрес)
    байт CC (типа функция)
    16 байт данных
    байт контрольной суммы CRC
    байт FF
    байт FF

    итого 22 байта.

    я уже все это получаю и разбираю следующим кодом:

    Код:
    PROGRAM com_read_prg
    VAR
    	com_settings: COMSETTINGS;
    	com_service_fb: COM_SERVICE;
    	com_port_num: PORTS := 0;
    	com_port_ready: BOOL;
    
    	bytes_read: DWORD;
    	buffer: ARRAY [1..50] OF BYTE;
    	package: ARRAY [1..22] OF BYTE;
    	p_pointer: POINTER TO ARRAY [1..22] OF BYTE;
    	i,ii: INT;
    	weight: weight_package;
    	p1: POINTER TO BYTE;
    END_VAR
    
    
    IF com_service_fb.ready=FALSE THEN
    	com_settings.Port:=com_port_num;
    	com_settings.dwBaudRate:=115200;
    	com_settings.byParity:=0;
    	com_settings.dwTimeout:=0;
    	com_settings.byStopBits:=0;
    	com_settings.dwBufferSize:=0;
    	com_settings.dwScan:=0;
    	com_service_fb(Enable:=TRUE, Settings:=com_settings, Task:=OPEN_TSK);
    	com_port_ready:=FALSE;
    ELSE
    	com_service_fb.Enable:=FALSE;
    	com_port_ready:=TRUE;
    END_IF
    
    IF com_port_ready THEN
    	bytes_read := SysComRead(com_settings.Port,ADR(buffer[1]),50,0);   (*каждый цикл читаем 50 байт данных потому что в них я точно найду нужные мне 22 байта*)
    	IF bytes_read > 0 THEN (*если что-то нашли*)
    		FOR i:=1 TO 28 DO (*то начинаем искать совпадение*)
    			IF (buffer[i] = 16#FF) AND (buffer[i+1] = 16#03) AND (buffer[i+2] = 16#CC) AND      (*не парюсь ищу совпадение по началу и концу которые всегда одинаковые*)
    			    (buffer[i+20] = 16#FF) AND (buffer[i+21] = 16#FF) THEN
    				p_pointer := ADR (buffer[i]);     (* если нашли то при помощи указателя*)
    				package := p_pointer^;             (*копируем найденное в массив ровно на 22 байта, это я потом чтобы контрольную сумму считать*)
    
    				p1 := ADR(weight.ch1);   (* weight - это структура тупо из 8 UINT, поэтому я свой массив перевожу в уинт чтобы далее его использовать*)
    				FOR ii:=4 TO 19 DO  
    					p1^ := package[ii];
    					p1 := p1+1;
    				END_FOR
    
    				EXIT;
    			END_IF
    
    		END_FOR
    	END_IF
    END_IF
    И у меня возникло несколько вопросов:
    1. Так как скорость 115200, я думаю считывая по 50 байт каждый цикл (50 мсек), мне кажется рано или поздно случится переполнение буфера?

    Я не очень понимаю как этот буфер устроен.
    2. Не понимаю - я читаю данные из конца или из начала этого буфера?
    3. Вроде как прочитанные данные из буфера стираются, это так или не очень?

    Анализируя данные в буфере я обратил внимание что посылки бывают кусками, хотя по факту я на 100000000000000% уверен что они всегда ровненькие и одинаковые
    4. Почему в буфере могут быть обрывки? это потому что я своими 50 байтами там оставляют объедки от них?


    Ну и самый главный вопрос - если у кого-то есть бесплатные идеи по оптимизации - готов бесплатно их выслушать =)
    Или в целом концепция как лучше поступить в моей ситуации - просто слушать эти 22 байта

  2. #2
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Для этого, в спецификации Serial порта предусмотрены дополнительные линии (DTR, DSR). Если интерфейс устройства предусматривает полный протокол (8 линий), то у вас не возникнет проблем переполнения.
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  3. #3

    По умолчанию

    Цитата Сообщение от keysansa Посмотреть сообщение
    Если интерфейс устройства предусматривает полный протокол (8 линий), то у вас не возникнет проблем переполнения.
    Я вижу, вы человек высокой культуры.

  4. #4
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Ох, опростоволосился... )
    ЗЫ. Но то, что люди покритиковали, а не предложили свое решение - мне тоже нравится )
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  5. #5
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Что является разделением пакетов - сигнатура пакета или пауза между ?
    Тоже покритикую, тогда.
    Валенок, вы не видите сигнатуры:
    байт FF
    байт 03 (типа его адрес)
    байт CC (типа функция)
    16 байт данных
    байт контрольной суммы CRC
    байт FF
    байт FF
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  6. #6
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Отлично. Только это не мне, а автору нужно цитировать, раз это предложение )
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  7. #7
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,288

    По умолчанию

    Цитата Сообщение от keysansa Посмотреть сообщение
    Валенок, вы не видите сигнатуры:
    3 раза подряд по 255 - вижу. Даете зуб что в данных их гарантированно нет ?

  8. #8

    По умолчанию

    Вопрос про то что есть ли пауза и есть ли FF в данных:
    1. пауз ни каких нет, просто без остановки фигачит
    2. опытным путем выявлено что максимальное значение может быть 65534, то есть FF FF не будет, будет только FF FE
    3. никаких линий больше нет, я имею ввиду RTS CTS и всякие там которые еще человек выше писал

    В целом пост направлен на то, что может кто подскажет более изящное решение, потому что мое мне кажется деревянным.
    И я переживаю за переполнение. И не понимаю из конца или из начала буфера я беру данные
    Последний раз редактировалось Raikkonen; 27.05.2022 в 12:57.

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    искать 3 (именно три) последовательных 255 и от этого синхронизироватся - после 3-его 255 (не 1-ого и не 2-ого) проверять 03, CC и следущих в конце (по получению нужного кол-ва) 2-х 255.
    Я приложил код, так и сделано - ищет FF 03 CC и через 20 байт FF FF.

    Что на счет переполнения буфера? и из конца или начала я их беру когда использую команду "Read"

  10. #10

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    не так.
    IF (buffer[i] = 16#FF) AND (buffer[i+1] = 16#03) AND (buffer[i+2] = 16#CC) AND (buffer[i+20] = 16#FF) AND (buffer[i+21] = 16#FF) THEN

    Перестановка мест слагаемых, я так понимаю?

    Цитата Сообщение от Валенок Посмотреть сообщение
    считывать всё возможное а не хватать иногда куски. Хотя "и так пойдет" имеет право на жизнь видимо. Хозяин - барин
    А как считывать все что есть то?
    Это измерение веса. Вес измерять чаще чем раз в 20 сек смысла нет.
    Я хочу просто быть уверенным в:
    1. Не наступит переполнения буфера
    2. Я получаю последние данные, а не те что дольше всех в буфере

    И так как я не понимаю как устроен буфер - не знаю.

    Вы даете какие-то абстрактные ответы, где 70% ответа это что-то про семечки и крякающую утку.
    Если обладаете знаниями - можете их оформить пожалуйста без дополнительных художественных украшений.....

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

Похожие темы

  1. Свободное ПО для опроса устройств (Modbus)
    от o_nik в разделе Трёп (Курилка)
    Ответов: 26
    Последнее сообщение: 09.11.2020, 14:15
  2. Ответов: 6
    Последнее сообщение: 05.03.2018, 10:46
  3. ПЛК110 М02 и свободное место на USB Flash?
    от Антон_Б в разделе ПЛК1хх [М02]
    Ответов: 0
    Последнее сообщение: 01.07.2017, 12:21
  4. чтение из плк
    от Wanted в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 03.12.2010, 13:18
  5. Свободное место на Flash диске
    от Логвиненко Андрей в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 09.11.2009, 15:04

Ваши права

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