Показано с 1 по 8 из 8

Тема: ST

  1. #1

    По умолчанию ST

    Здравствуйте, коллеги.

    Есть задача написать проект полностью на ST. Приходится мучиться с опросом блоков, открытием портов и т.д.

    не могу кое с чем разобраться. Помогите пожалуйста. В коде снизу опрашиваю блок МВ110-8а по модбас. Компиляцию проходит, но проверить правильность я не могу.

    (*Объявил переменные, как в примерах*)

    Ia1: REAL; (*считанное значение,вход 1*)
    Ia2: REAL; (*считанное значение,вход 2*)
    Ia3: REAL; (*считанное значение,вход 3*)
    Ia4: REAL; (*считанное значение,вход 4*)
    Ia5: REAL; (*считанное значение,вход 5*)
    Ia6: REAL; (*считанное значение,вход 6*)
    Ia7: REAL; (*считанное значение,вход 7*)
    Ia8: REAL; (*считанное значение,вход 8*)

    ptr_D:POINTER TO BYTE;


    (* функция 03 флоат - ФБ считывает значение параметра типа int из прибора с адресом 16 из регистра с номером 4 по протоколу Modbus-ASCII *)
    mv110_modbus(
    Enable:=enabl , (* разрешение работы блока *)
    Mode:=MB_ASCII , (*режим передачи*)
    DevAddr:=16 , (*адрес блока*)
    FirstAddr:=4 , (*номер регистра*)
    Quantity:=43, (*количество регистров*)
    ComHandle:=Settings.Port , (*номер COM-порта*)
    TimeOut:=TimeOut , (*Таймаут T#50ms*)
    Buffer:=Buffer , (* буфер данных *)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err , (* скопировать регистр ошибок *)
    ByteCnt=>DataSize ); (*кол-во считанных байтов *)
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа FLOAT*)
    (*1й вход,регистр 4,5 -измеренное значение типа Float*)
    ptr_D:=ADR(Ia1);
    ptr_D^:=buffer[1];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[0];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[3];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[2];

    (*2й вход,регистр 10,11*)
    ptr_D:=ADR(Ia2);
    ptr_D^:=buffer[13];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[12];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[15];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[14];

    (*3й вход,регистр 16,17*)
    ptr_D:=ADR(Ia3);
    ptr_D^:=buffer[24];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[25];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[27];
    ptr_D:=ptr_D+1;
    ptr_D^:=buffer[26];

    и т.д. Есть ли ошибки?Не совсем понимаю эту конструкцию.

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

    По умолчанию

    облегчите себе жизнь

    Код:
    type ai_sourse
    struct
      DP : word;
      iValueDP : int;
      Status : word;
      Cyclic : word;
      Value : real
    end_struct
    end_type //6 регистров
    
    var
      mva8 : array[1..8] of ai_sourse; //тут - всё
      pd : pointer to dword;
    
    ...
    if  cmpl and err = 0 then 
      sysmemcpy(adr(mva8), adr(buffer), sizeof(mva8));
      for i:=1 to 8 do
        pd := adr(mva8[i].value);
        pd^ := rol(pd^, 16);
      end_for //вот и всё
    end_if
    Последний раз редактировалось Валенок; 04.08.2014 в 12:35.

  3. #3

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    облегчите себе жизнь

    Код:
    type ai_sourse
    struct
      DP : word;
      iValueDP : int;
      Status : word;
      Cyclic : word;
      Value : real
    end_struct
    end_type //6 регистров
    
    var
      mva8 : array[1..8] of ai_sourse; //тут - всё
      pd : pointer to dword;
    
    ...
    if  cmpl and err = 0 then 
      sysmemcpy(adr(mva8), adr(buffer), sizeof(mva8));
      for i:=1 to 8 do
        pd := adr(mva8[i].value);
        pd^ := rol(pd^, 16);
      end_for //вот и всё
    end_if
    Валенок, у меня другое устройство же. Или разницы нет? Я не знаю,что за оператор sysmemspy((( есть ли у вас литература, где можно про это все почитать? А вообще я правильно написал код?

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

    По умолчанию

    Функцию работы с памятью можно заменить и указателем

  5. #5

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Функцию работы с памятью можно заменить и указателем
    Можно, если знаний хватает)) Так кто-нибудь ответит на вопрос темы то? В примерах есть запись по модбас. А как мне поступить в случае с модемом? ПЛК в такой случае же тоже мастер, а надо его слейв сделать((

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

    По умолчанию

    Ну скажем что правильно, а у Вас порт не сконфигурирован или а и б перепутаны или модуль настроен принимать другой протокол, ведь в таком случае работать всёравно не будет

    Зы а по поводу модема, тут Вы аообще рано задаете вопрос, пока на столе отработайте

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Ну скажем что правильно, а у Вас порт не сконфигурирован или а и б перепутаны или модуль настроен принимать другой протокол, ведь в таком случае работать всёравно не будет

    Зы а по поводу модема, тут Вы аообще рано задаете вопрос, пока на столе отработайте
    1)Я же не полностью текст выложил.Проект снизу. Еще такой вопрос PORT=0, это 485, а у меня на плк их два. Вопрос- как второй выбрать?
    2)Я через конфигуратор уже сделал рабочий проект с модемом, но он на СFC c блоками на st. А сейчас мне на ST все надо сделать
    Вложения Вложения
    • Тип файла: pro dip.pro (73.6 Кб, Просмотров: 14)

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

Похожие темы

  1. язык St
    от жекон в разделе ПЛК1хх
    Ответов: 13
    Последнее сообщение: 12.08.2017, 20:00
  2. ST.
    от _Александр_ в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 20.08.2011, 09:59
  3. St программирование
    от TouchS в разделе ПЛК1хх
    Ответов: 28
    Последнее сообщение: 19.02.2010, 16:37
  4. язык St
    от Сергей71 в разделе ПЛК1хх
    Ответов: 18
    Последнее сообщение: 23.01.2008, 13:19

Ваши права

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