PDA

Просмотр полной версии : Использование 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
Благодарю за ответ

kir2
23.11.2016, 12:26
Евгений, а чтение группы смежных регистров 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

kir2
23.11.2016, 13:41
Спасибо за оперативный ответ и полезные функции т.к. в "sp3xx._rukovodstvo_polzovatelya_[1.1].pdf" информации по макросам недостаточно.

Евгений Кислов
23.11.2016, 13:46
Спасибо за оперативный ответ и полезные функции т.к. в "sp3xx._rukovodstvo_polzovatelya_[1.1].pdf" информации по макросам недостаточно.

При обновлении руководства дополню главу про макросы. Но, в целом, описать их возможности целиком достаточно сложно, поскольку все это опирается на описание синтаксиса и возможностей языка С - а на эту тему есть соответствующая литература.

GSK
12.04.2017, 11:20
Добрый день.

В некоторых примерах я встречаю:.........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 одинаковый программный интерфейс - по ряду причин удобнее было сделать так.

petera
12.04.2017, 13:06
У 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.

GSK
12.04.2017, 13:14
WORD wValue=120;

Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, wValue);

Для Write аналогично?

petera
12.04.2017, 13:17
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);

GSK
12.04.2017, 13:22
Так можно?
BOOL bValue;
Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 12, TYPE_BIT, &bValue);

petera
12.04.2017, 13:31
Так можно?
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);

GSK
13.04.2017, 12:52
И еще вопросик)

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 в макросах.

GSK
13.04.2017, 13:12
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);

Так? А то что то совсем запутался

petera
13.04.2017, 13:15
А разве так не работает?
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);

GSK
13.04.2017, 13:20
Панели пока нет под рукой. Попробую вечером.
Пока хотел бы разобраться.
Кто то же уже использовал FLOAT переменные в макросах.

Хотелось бы взглянуть на чтение и запись в PFW... А то как то все методом проб и ошибок.

И я надеюсь это многим будет полезно!

GSK
13.04.2017, 13:30
В руководстве пользователя:

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);

Четыре байта?

petera
13.04.2017, 13:36
В руководстве пользователя:

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

Можно цифры писать вместо типа

GSK
13.04.2017, 13:42
Понял. Спасибо.
Плохо что нет эмуляции макросов...(((

petera
13.04.2017, 20:15
А разве так не работает?
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

GSK
18.04.2017, 12:26
Rake Runner спасибо.
Такой вариант я тоже использую...

GSK
18.04.2017, 14:11
Подскажите пожалуйста что не так?

;
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);

- и все будет нормально.