petera спасибо, так заработало. Видимо что-то не так делал сперва.
А вопрос по поводу как правильно делать через конфигуратор задач остается... можно ли передавать параметры в программу и возвращать обратно и как правильно это делать ?
Вид для печати
petera спасибо, так заработало. Видимо что-то не так делал сперва.
А вопрос по поводу как правильно делать через конфигуратор задач остается... можно ли передавать параметры в программу и возвращать обратно и как правильно это делать ?
Например, как было сказано выше, через глобальные переменные.
Вложение 14074 Вложение 14075
Здесь X и IN глобальные переменные для передачи значений в циклическую программу. А результат ее работы в главной программе берется путем обращения к переменной "А" по имени PRG2.А, хотя ее тоже можно было сделать глобальной.
Странно, вроде вчера через глобальные делал точно так же, и не заработало, видать спал уже, сейчас набросал пример и все вроде как завелось.
Может как-то влиять, что я переменную из Modbus сразу назначил глобальной ?
Ну и вот для примера, разница подсчета видна. В первом случае в другой программе с таймером.
Во втором случае вызов каждую секунду из конфигуратора задач. В начале пути опрос через конфигуратор опережает. но значения повторяются, а дальше видно, что значения во втором случае выше. Переменная kwt и kwt1.
Смущает эта фраза. Переменная из модбас сама по себе глобальная без назначений.Цитата:
что я переменную из Modbus сразу назначил глобальной ?
Ретайн это то, что объявлено как ретайн + область ioЦитата:
Глобальные переменные вроде являются Retain или нет ?
Имхо, для большей точности и здравого смысла расчеты нужно делать только в момент прихода ))).Цитата:
беря данные из однофазного мультиметра считать киловатт_часы и значения были близки к показаниям счетчик
Интеграл := интеграл + значение*dt. Остальное время можно курить бамбук.
1. Любые объявления переменных в конфигурации, в том числе и в модуле Modbus, являются глобальными по умолчанию. Т.е. их не нужно объявлять глобальными где-либо еще.
2. В эмуляции будет так, как Вы и описываете, разница будет постепенно увеличиваться. При загрузке в ПЛК разницы быть не должно. Возможна разница только на значение одного вычисления из-за асинхронного вызова подпрограмм.
ЗЫ. К стати в примере из http://www.owen.ru/forum/showthread....l=1#post143814
Ошибка должно быть так
Код:TM(in:=NOT TM.q, pt:=t#1s);
IF NOT TM.q THEN
A:=A+IN/X;
END_IF
Валенок и как понять, что случился "приход" ? если отталкиваться, что читаю по modbus
petera на последней картинке IF TM.Q Then и работает, если поставить IF NOT то считаться будет в течение всей секунды, разве нет ?
Цитата:
как понять, что случился "приход" ?
Если переживаете про постоянное значение (на реальном процессе никогда не будет, для эмуляции пойдет) - прикрутите таймерКод:var
pre : real;
приход : bool;
приход := ai <> pre; //Косвенный, но верный. Если юзаете через б-ки то там факт прихода напрямую
pre := ai;
PSКод:var
t : ton := (pt :=заведомо больше цикла опроса);
t(in:= not приход);
приход:=ai <> pre or t.q;
pre:=ai;
if приход then
интеграл := интеграл + ai * time_to_real(time() - t) / 1000;
t := time();
end_if
И, кстати, отсутствие прихода - косвенный признак обрыва связи с модулем
Код:var
connect : tof := (in:= true, pt := 3..10 циклов опроса);
connect(); //игнорим на старте - ведь еще не успели связатся
connect.in := приход;
if not connect.q then
..
end_if
Валенок спасибо, попробую и по приходу. Просто правильнее в любом случае делить на период опроса, иначе мы не кВт часы получим, а что-то эфемерное...
Ведь приход может быть как раньше секунды, так и позже секунды и как тогда программировать время ?
Суть. кВт час = (при опросе раз в секунду) мощность(в кВт)/3600
Хотя наверное 3600 можно превратить в переменную, зависящую от времени опроса, только формула будет посложнее.