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

Тема: ЧТЕНИЕ ДАННЫХ ИЗ ПОРТА RS-232

  1. #1

    По умолчанию ЧТЕНИЕ ДАННЫХ ИЗ ПОРТА RS-232

    Добрый день, уважаемые форумчане!
    У меня стоит следующая задача:
    К ПЛК подключен датчик, который по каналу RS232 постоянно шлет данные с частотой 10Гц в виде 'FF FF 75 2A 4B 9C', обращаться к датчику не нужно, только открыть порт и читать. В пересылаемых данных всегда присутствует "FF FF" остальные значения меняются.
    При помощи каких программных средств CoDeSys можно извлекать из этого пакета данных только "75 2А" и писать это значение в переменную. Далее мне нужно это преобразовать в десятичный формат, так как данные в шестнадцатеричном формате. Я написал программку, которая преобразует шестнадцатеричное число в десятичное, но как мне кажется программа очень медленно работает, может есть у кого другое решение, буду очень признателен за помощь!

    Вот собственно программка:
    PROGRAM PLC_PRG
    VAR
    HEX_INPUT:STRING; (*ВВОДИМОЕ ШЕСТНАДЦАТЕРИЧНОЕ ЧИСЛО*)
    DEC_OUTPUT:REAL; (*ПОЛУЧЕННОЕ ДЕСЯТИЧНОЕ ЧИСЛО*)
    DEC_VALUE:REAL;
    EXPONENT:WORD; (*СТЕПЕНЬ*)
    STAGE:WORD;
    X:INT;
    START:BOOL;
    STOP: BOOL;
    HEX_VALUE:STRING;
    I:WORD;
    TRIG_I:R_TRIG;
    LETTER:ARRAY [1..6] OF STRING := 'A', 'B', 'C', 'D', 'E', 'F';
    NUMBER: ARRAY [1..6] OF INT := 1, 2, 3, 4, 5, 6;
    J:WORD;
    END_VAR

    (*ЭТА ЧАСТЬ НУЖНА ДЛЯ АВТОМАТИЧЕСКОГО ПЕРЕСЧЕТА В СЛУЧАЕ ВВЕДЕННОГО НОВОГО ЗНАЧЕНИЯ*)
    IF HEX_VALUE <> HEX_INPUT THEN
    DEC_VALUE := 0;
    STOP := FALSE;
    START := FALSE;
    TRIG_I(CLK := FALSE);
    END_IF

    EXPONENT := LEN(HEX_INPUT);
    IF EXPONENT > 0 THEN
    START := TRUE;
    TRIG_I(CLK := TRUE);
    IF TRIG_I.Q THEN
    I := EXPONENT - 1;
    END_IF
    END_IF
    (*ДО ЭТОГО МОМЕНТА*)
    (*ДАЛЕЕ САМО ПРЕОБРАЗОВАНИЕ*)
    IF START AND NOT STOP THEN
    IF I >= 0 THEN
    J := 0;
    WHILE J<6 DO
    J := J + 1;
    IF LETTER[ J ] = MID(HEX_INPUT,1,(EXPONENT - I)) THEN
    X := NUMBER[J];
    EXIT;
    END_IF
    END_WHILE

    CASE X OF
    0: DEC_VALUE := DEC_VALUE + STRING_TO_REAL(MID(HEX_INPUT,1,(EXPONENT - I)))*EXPT(16,I);
    1: DEC_VALUE := DEC_VALUE + 10*EXPT(16,I);
    2: DEC_VALUE := DEC_VALUE + 11*EXPT(16,I);
    3: DEC_VALUE := DEC_VALUE + 12*EXPT(16,I);
    4: DEC_VALUE := DEC_VALUE + 13*EXPT(16,I);
    5: DEC_VALUE := DEC_VALUE + 14*EXPT(16,I);
    6: DEC_VALUE := DEC_VALUE + 15*EXPT(16,I);
    END_CASE
    IF I > 0 THEN
    I := I - 1;
    ELSE
    I := 0;
    DEC_OUTPUT := DEC_VALUE;
    STOP := TRUE;
    END_IF
    X := 0;
    END_IF
    END_IF
    HEX_VALUE := HEX_INPUT;

  2. #2
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,585

    По умолчанию

    а сразу из буфера прочитать word нельзя ?
    Word_to_int и так далее ваших 75 2A ? Соответственно принимать портом в hex режиме.

  3. #3

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    а сразу из буфера прочитать word нельзя ?
    Word_to_int и так далее ваших 75 2A ? Соответственно принимать портом в hex режиме.
    Как Вы предлагаете прочитать? Значение "75 2А" это одно из возможных, которое все время меняется с частотой 10Гц

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    Цитата Сообщение от deniska13 Посмотреть сообщение
    Как Вы предлагаете прочитать? Значение "75 2А" это одно из возможных, которое все время меняется с частотой 10Гц
    о ком Вы так заботитесь с этим переводом различных систем исчисления на такой скорости, контроллер понимает любой из них
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    о ком Вы так заботитесь с этим переводом различных систем исчисления на такой скорости, контроллер понимает любой из них
    Я просто в симуляторе прогонял эту программу (преобразования шестнадцатеричного числа в десятичное) и как мне показалось время преобразования не мгновенное, а около секунды, а мне нужно быстрее, так как по этому значению будет строится график и производиться дополнительные расчеты.
    Подскажите как мне читать из всей кучи данных получаемых от устройства только часть, а именно "75 2А"......

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    чего там читать то, если в принятом массиве байт встретились два байта, равные максимальному значению в диапазоне, значит следующие два байта идут информационные данные, через указатель нужного типа их записываете в соответствующую переменную
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    чего там читать то, если в принятом массиве байт встретились два байта, равные максимальному значению в диапазоне, значит следующие два байта идут информационные данные, через указатель нужного типа их записываете в соответствующую переменную
    С указателями у меня непонимание, могли бы Вы отразить свои мысли программно?)

  8. #8

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Код:
    PROGRAM Scan
    VAR_OUTPUT
    	Ok : BOOL;
    	Result : INT;
    END_VAR
    VAR
    	i : INT;
    END_VAR
    ---------------------------
    Ok:=FALSE;
    WHILE SysComRead(0,ADR(Result),1,0)=1 THEN
    	CASE i OF
    		0,1: i:=SEL(INT_TO_BYTE(Result)=255,0,i+1);
    		2: Result:=Result*256; i:=3;
    		3: Result:=ROL(INT_TO_WORD(Result),8); Ok:=TRUE; i:=0; EXIT;
    	END_CASE
    END_WHILE
    ***********************
    Scan();
    IF Scan.Ok THEN
    	Scan.Result ....
    END_IF
    Что делает эта программа?
    Можете комментарии добавить в строках....

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Возвращает int после двух 255.
    PS
    Должна ))
    PS PS
    Ok := False; (*Ok устанавливается в False*)
    ..
    Можете пояснить что происходит в этих строках
    WHILE SysComRead(0,ADR(Result),1,0)=1 THEN
    2: Result:=Result*256; i:=3; (*полученное значение умножаем на 256 и записываем в нашу переменную затем переходим на 3*)
    3: Result:=ROL(INT_TO_WORD(Result),8); Ok:=TRUE; i:=0; EXIT; (*побитовый сдвиг влево на 8, для чего?*)

    А можно просто с "FF" сравнивать?

  10. #10

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Можно. Это в 0,1:.... и есть
    А в этой части "ADR(Result)" я с этой функцией никак не могу разобраться....

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

Похожие темы

  1. Чтение/запись данных по сети
    от Атаман в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 18.12.2016, 06:57
  2. Чтение данных с СПК110 по RS 232
    от GoodLuck в разделе СПК1хх
    Ответов: 3
    Последнее сообщение: 24.11.2015, 21:46
  3. Чтение данных СИ8
    от Sevel в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 14.11.2014, 17:46
  4. Чтение данных с ТРМ 138 в паскале
    от Дмитрий Щаднев в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 03.03.2011, 13:36
  5. нужна помощь. чтение из Rs-232 порта
    от DMel в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 21.01.2010, 09:28

Ваши права

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