Просмотр полной версии : Использование PFW регистров в скриптах для СП310
_Алексей_
08.08.2016, 08:59
Здравствуйте, может кто-нибудь подсказать как задействовать в скриптах работу с PFW регистрами?
PSW регистры можно использовать в скриптах, а PFW в редакторе не подсвечиваются и компилятор ошибку выдает.
Евгений Кислов
08.08.2016, 09:16
Здравствуйте, может кто-нибудь подсказать как задействовать в скриптах работу с PFW регистрами?
PSW регистры можно использовать в скриптах, а PFW в редакторе не подсвечиваются и компилятор ошибку выдает.
Прикладываю пример. В нем с помощью макроса считывается значение PFW256 и записывается в PFW300.
_Алексей_
08.08.2016, 10:04
То есть также использовать как PSW регистры PSW[300] = 33 не получиться?
Евгений Кислов
08.08.2016, 10:35
То есть также использовать как PSW регистры PSW[300] = 33 не получиться?
Конкретно в таком виде - не получится, но можно сделать функцию в глобальном макросе и использовать ее в стиле:
WritePFW(300,33);
_Алексей_
08.08.2016, 10:43
Благодарю за ответ
Евгений, а чтение группы смежных регистров PFW в виде:
WORD Arr[21];
Reads(HMI_LOCAL_MCH, 0, TYPE_PFW, 500, 21, &Arr);
будет работать?
Т.к. макрос в офлайн-эмуляции не работает и панели под руками нет, а нужно считать 21 регистр PFW500...PFW520 в массив.
Евгений Кислов
23.11.2016, 12:51
Да, работать будет. Возможно, окажется полезен приложенный пример - в нем в глобальном макросе подготовлены функции для работы с памятью (по сути, обвязка вокруг встроенных), которые можно использовать в своих макросах. Также приведен пример работы с этими функциями.
http://www.owen.ru/forum/showthread.php?t=25952&p=233959&viewfull=1#post233959
Спасибо за оперативный ответ и полезные функции т.к. в "sp3xx._rukovodstvo_polzovatelya_[1.1].pdf" информации по макросам недостаточно.
Евгений Кислов
23.11.2016, 13:46
Спасибо за оперативный ответ и полезные функции т.к. в "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);
Подскажите пожалуйста за что отвечают эти нолик и единичка отмеченные галочкой? В описание про них не сказано...
Заранее спасибо.
Евгений Кислов
12.04.2017, 12:30
У Read там всегда 0. У Reads в поле указывается кол-во считывемых регистров.
В итоге у функций Read/Reads одинаковый программный интерфейс - по ряду причин удобнее было сделать так.
У Read там всегда 0.
Это справедливо отчасти. Только если тип данных будет регистр(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 аналогично?
WORD wValue=120;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, wValue);
Для Write аналогично?
Аналогично.
Константу 120 можно сразу указать
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, 120);
Так можно?
BOOL bValue;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 12, TYPE_BIT, &bValue);
Так можно?
BOOL bValue;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 12, TYPE_BIT, &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
Евгений Кислов
13.04.2017, 12:58
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);
Четыре байта?
В руководстве пользователя:
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);
Четыре байта?
Предопределенные типы
TYPE_BIT = 1
TYPE_BYTE = 2
TYPE_WORD = 3
TYPE_DWORD = 4
Можно цифры писать вместо типа
Понял. Спасибо.
Плохо что нет эмуляции макросов...(((
А разве так не работает?
float Value = 123.4;
int Adr =701;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, Adr, 0, TYPE_DWORD, Value);
Так не работает:(
А так работает
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);
Rake Runner
13.04.2017, 21:43
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;
Мозги уже кипят(((
Евгений Кислов
18.04.2017, 14:46
*(float*) должны находиться по четным адресам.
*(float*)(PSW+380) = 11.5;
fValue = *(float*)(PSW+380);
- и все будет нормально.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot