[ New messages · Members · Forum rules · Search · RSS ]
Page 1 of 11
Forum moderator: Alexor 
Forum » Process Simulator » Russian » Вычитка переменных типа "DateTime"
Вычитка переменных типа "DateTime"
denzhigDate: Tuesday, 10.01.2017, 20:52 | Message # 1
Sergeant
Group: Users
Messages: 32
Reputation: 0
Status: Offline
Вечер добрый.

Разбираюсь с вычиткой времени и дат из контроллера и никак не могу оптимизировать преобразование S7_DATE_AND_TIME в удобоваримый текст.
Тут заметил что при назначении типа вычитываемой переменной есть тип "DateTime" - а как его использовать ума не приложу.
Он же вроде в C# 6-8 байт, а из контроллера только DWORD за раз можно вычитать, а массив сама переменная не принимает.
Может подскажите как сделать?


Message edited by denzhig - Tuesday, 10.01.2017, 20:54
 
AlexorDate: Wednesday, 11.01.2017, 09:33 | Message # 2
Major general
Group: Administrators
Messages: 275
Reputation: 1
Status: Offline
Добрый день,

Чего-то не понял где вы назначаете тип читаемой переменной DateTime?

Думаю в случае с DATE_AND_TIME, нужно вычитать массовом байт и потом в скрипте сделать текст.
 
denzhigDate: Wednesday, 11.01.2017, 18:06 | Message # 3
Sergeant
Group: Users
Messages: 32
Reputation: 0
Status: Offline
я наверное не так выразился.
Как я понимаю, когда мы создаём переменную на вычитку из контроллера мы можем указать только семёновские типы, при этом максимум будет DWORD.
А вот уже после создания переменной, нажав кнопку "write", можно выбрать тип (из выпадающего меню) какой переменная будет внутри симулятора и вот там (в выпадающем меню) есть тип "DateTime".
Я думал как-то его прикрутить к вычитке переменных типа "DATE_AND_TIME" из контроллера, но что-то никак.
Даже в скрипте отдельной переменной C#-кий "DateTime" он не полный берёт - "мс" откидывает.
Просто конструкция в скрипте получается громоздкой при разборе ручками по-байтно:
Code
var rArray  = 'Gov.datetime' as Array;
byte i;
i = Convert.ToByte(rArray.GetValue(0));
мы только получили первый байт (а минимум их 8), а уже два действия выполнили.
А ещё дальше надо в BCD переделать, не говоря про манипуляции с годом.
А если ещё и отобразить надо, то в цикл это не завернёшь - надо писать 10-15 строк для каждой отображаемой переменной.
...а время цикла скрипта уже подходит к 1,5-2 сек...
Вот поэтому (а может просто из-за лени) стал искать более изящное решение, может кто уже писал подобное.
А у Вас никогда не возникало ситуации с необходимостью в симуляторе получить тип DATE_AND_TIME и отобразить его?


Message edited by denzhig - Wednesday, 11.01.2017, 18:14
 
AlexorDate: Thursday, 12.01.2017, 09:31 | Message # 4
Major general
Group: Administrators
Messages: 275
Reputation: 1
Status: Offline
На самом деле кнопка Write просто позволяет записать в переменную значение. Тип данных зависит от соединения. Например, переменные соединения Internal позволяют туда записывать любые типы, если не стоит галочка “Type change is prohibited”. Для соединений S7 при попытке записи значения не совместимого типа может быть ошибка. Но даже если конвертация получилась – тип переменной не изменится.

Нет, если честно, с типом DATE_AND_TIME вообще никогда не работал.
Можете написать свой plug-in – конвертер. Примеры есть на github (Converter.Inverse). У конвертера всего два метода (остальное можно скопипастить):

public object convertValue(object aValue)
и
public object unconvertValue(object aValue)

Когда соединение считывает новое значение оно передаётся в convertValue и результат уже идёт дальше в симуляционные объекты и для панелей.
Если происходит запись значения со стороны симулятора то значение проходит через unconvertValue, прежде чем попасть в переменную соединения.
 
Forum » Process Simulator » Russian » Вычитка переменных типа "DateTime"
Page 1 of 11
Search: