Страница 1 из 5 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

    По умолчанию

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

  6. #6

    По умолчанию

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

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

  7. #7

    По умолчанию

    Какой интервал между посылками?
    50 мс цикл может быть маловат!
    Я бы сдела кольцевой буфер, указатель чтения и записи.
    И ходил бы по ниму искал пакеты

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

    По умолчанию

    Цитата Сообщение от Samel Посмотреть сообщение
    Какой интервал между посылками?
    50 мс цикл может быть маловат!
    Я бы сдела кольцевой буфер, указатель чтения и записи.
    И ходил бы по ниму искал пакеты
    ТС боится, что из за скорости передачи 115200 он не сможет обработать все посылки.
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  9. #9

    По умолчанию

    Цитата Сообщение от keysansa Посмотреть сообщение
    ТС боится, что из за скорости передачи 115200 он не сможет обработать все посылки.
    Эту проблему решит уменьшение времени цикла и кольцевой буфер. 115200 это гдето 520 байт в 50 мс

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

    По умолчанию

    Цитата Сообщение от Samel Посмотреть сообщение
    Эту проблему решит уменьшение времени цикла и кольцевой буфер. 115200 это гдето 520 байт в 50 мс
    А зачем вообще кольцевой буфер? Почему не хватит обычного?
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

Страница 1 из 5 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

Ваши права

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