PDA

Просмотр полной версии : ST



WARchun
04.08.2014, 11:44
Здравствуйте, коллеги.

Есть задача написать проект полностью на 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];

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

Валенок
04.08.2014, 12:31
облегчите себе жизнь


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

WARchun
04.08.2014, 12:43
облегчите себе жизнь


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((( есть ли у вас литература, где можно про это все почитать? А вообще я правильно написал код?

capzap
04.08.2014, 12:54
Функцию работы с памятью можно заменить и указателем

WARchun
04.08.2014, 13:06
Функцию работы с памятью можно заменить и указателем

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

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

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

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

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

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

Валенок
04.08.2014, 16:15
http://www.owen.ru/forum/showthread.php?t=10263&highlight=com3
пост#2