Здравствуйте, может кто-нибудь подсказать как задействовать в скриптах работу с PFW регистрами?
PSW регистры можно использовать в скриптах, а PFW в редакторе не подсвечиваются и компилятор ошибку выдает.
Вид для печати
Здравствуйте, может кто-нибудь подсказать как задействовать в скриптах работу с PFW регистрами?
PSW регистры можно использовать в скриптах, а PFW в редакторе не подсвечиваются и компилятор ошибку выдает.
То есть также использовать как PSW регистры PSW[300] = 33 не получиться?
Благодарю за ответ
Евгений, а чтение группы смежных регистров PFW в виде:
WORD Arr[21];
Reads(HMI_LOCAL_MCH, 0, TYPE_PFW, 500, 21, &Arr);
будет работать?
Т.к. макрос в офлайн-эмуляции не работает и панели под руками нет, а нужно считать 21 регистр PFW500...PFW520 в массив.
Да, работать будет. Возможно, окажется полезен приложенный пример - в нем в глобальном макросе подготовлены функции для работы с памятью (по сути, обвязка вокруг встроенных), которые можно использовать в своих макросах. Также приведен пример работы с этими функциями.
http://www.owen.ru/forum/showthread....l=1#post233959
Спасибо за оперативный ответ и полезные функции т.к. в "sp3xx._rukovodstvo_polzovatelya_[1.1].pdf" информации по макросам недостаточно.
Добрый день.
В некоторых примерах я встречаю:.........V
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 1, TYPE_WORD, &wValue);
а в других:..........................................V
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 0, TYPE_WORD, &wValue);
Подскажите пожалуйста за что отвечают эти нолик и единичка отмеченные галочкой? В описание про них не сказано...
Заранее спасибо.
У Read там всегда 0. У Reads в поле указывается кол-во считывемых регистров.
В итоге у функций Read/Reads одинаковый программный интерфейс - по ряду причин удобнее было сделать так.
Это справедливо отчасти. Только если тип данных будет регистр(TYPE_WORD)
Описание команды в справке
BOOL Read (PortName, SlaveID, DeviceTypeReg, Adr, 0, DataType, &Var);
не полное.
Команда также может читать состояние отдельных бит регистра. Тип данных - бит (TYPE_BIT)
BOOL Read (PortName, SlaveID, DeviceTypeReg, Adr1, Adr2, DataType, &Var);
где
Adr1 - первая часть адреса (номер регистра)
Adr2 - вторая часть адреса (номер бита в регистре)
Например
BOOL bValue;
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 12, TYPE_BIT, &bValue);
Здесь в переменную bValue читается состояние двенадцатого бита регистра PFW256.
WORD wValue=120;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, wValue);
Для Write аналогично?
Так можно?
BOOL bValue;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 12, TYPE_BIT, &bValue);
И еще вопросик)
WORD Adr = 0;
WORD wValue = 0;
DWORD dValue = 0;
/* Так работает */
wValue = 12;
Adr = 700;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 0, TYPE_WORD, wValue);
/* Так не работает работает */
dValue = 123.4;
Adr = 701;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 0, TYPE_DWORD, dValue);
Почему во втором случае не работает. Отображается 0.0
dValue - это DWORD, а 123.4 - это float. В руководстве пользователя написано, как работать с float в макросах.
WORD Adr = 0;
WORD wValue = 0;
DWORD dValue = 0;
float fValue = 0.0;
fValue = 123.4;
Adr = 701;
Writes(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 2, fValue);
Так? А то что то совсем запутался
А разве так не работает?
float Value = 123.4;
int Adr =701;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 0, TYPE_DWORD, Value);
ЗЫ.
Тогда уже не
Writes(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 2, fValue);
а так
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 4, fValue);
Панели пока нет под рукой. Попробую вечером.
Пока хотел бы разобраться.
Кто то же уже использовал FLOAT переменные в макросах.
Хотелось бы взглянуть на чтение и запись в PFW... А то как то все методом проб и ошибок.
И я надеюсь это многим будет полезно!
В руководстве пользователя:
Reads(PLC, 2, MODBUS_RTU_REG_4X, 4, 2, &ArrValue);
По этому по аналогии и предположил:
Writes(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 2, fValue);
А почему здесь 4
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 4, fValue);
Четыре байта?
Понял. Спасибо.
Плохо что нет эмуляции макросов...(((
Так не работает:(
А так работает
Еще пример, рабочийКод:float Value = 123.4;
int Adr =700;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 0, TYPE_DWORD, Float_2_DWord(Value));
По этому такая конструкция тоже работаетКод:float a, b, result[4];
Reads(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 2, &a); //Читать из PFW300 значение "a" (Float)
Reads(HMI_LOCAL_MCH, 0, TYPE_PFW, 302, 2, &b); //Читать из PFW302 значение "b" (Float)
/* Или вариант с функцией READ()
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_DWORD, &a);
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 302, 0, TYPE_DWORD, &b);
*/
result[0]=a+b;
result[1]=a-b;
result[2]=a*b;
if(b!=0)
result[3]=a/b;
Writes(HMI_LOCAL_MCH, 0, TYPE_PFW, 304, 8, result); //Записать в PFW304, PFW306, PFW308, PFW310 результаты вычислений в формате Float
Код:float Value[1] = {567.8};
int Adr =700;
Writes(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 2, Value);
GSK, если усложнение себе жизни не самоцель (как у некоторых), то просто перед вызовом макроса забирайте данные из PFW в PSW, а после вызова копируйте их из PSW в PFW. В таком стиле:
Вложение 30542
Rake Runner спасибо.
Такой вариант я тоже использую...
Подскажите пожалуйста что не так?
;
float fValue;
int Adr=0;
int OFFSET=0;
Вот такое не работаетю Панель виснет:
*(float*)(PSW+379) = 11.5;
fValue = *(float*)(PSW+379);
Adr = 701 + OFFSET;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 0, TYPE_DWORD, Float_2_DWord(fValue));
Вот такое работает:
fValue = 123.2;
Adr = 701 + OFFSET;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 0, TYPE_DWORD, Float_2_DWord(fValue));
Вот такое не работаетю Панель виснет:
*(float*)(PSW+379) = 11.5;
Мозги уже кипят(((
*(float*) должны находиться по четным адресам.
- и все будет нормально.Код:*(float*)(PSW+380) = 11.5;
fValue = *(float*)(PSW+380);