PDA

Просмотр полной версии : Чтение/запись данных по Modbus панели СП310



_Алексей_
22.08.2018, 09:14
Здравствуйте,
подскажите, что возвращают функции чтения/записи данных по Modbus при работе с макросами для панели СП 310-р,
т.е. функции read, reads, write, writes?

Евгений Кислов
22.08.2018, 09:16
Добрый день.
Возвращают BOOL (TRUE - операция выполнена успешно, FALSE - что-то пошло не так).

_Алексей_
28.08.2018, 13:07
Подскажите еще, почему синтаксис функции Reads -
Reads(PortName, SlaveID, DeviceRegType, Adr, Length, &ArrVar);
в руководстве пользователя, требует взятия адреса переменной массива, а функция Writes -
Writes(PortName, SlaveID, DeviceRegType, Adr, Length, ArrVar);
не требует?

Ведь они объявлены одинаково:

typedef BOOL (*MacroFReads)(int comID, int staID, int objType, int add1, int regs, void* pRegs);
typedef BOOL (*MacroFWrites)(int comID, int staID, int objType, int add1, int regs, void* pRegs);

struct MACRO_CALL_BACK
{
WORD* pPSW;
BYTE* pPSB;
MacroFRead pRead;
MacroFReads pReads;
MacroFWrite pWrite;
MacroFWrites pWrites;

..................
}Macro;

#define Reads (Macro.pReads)
#define Write (Macro.pWrite)

Имя массива это же указатель на первый его элемент, т.е. содержит адрес первого элемента массива,
а при вызове Reads получается передается адрес этого указателя.

Можно вызывать Reads вот так:

WORD arrReadModbusRtu[62];
Reads(PLC,1,MODBUS_RTU_REG_4X,0,62,arrReadModbusRt u);

Евгений Кислов
28.08.2018, 13:16
Можно вызывать Reads вот так:

WORD arrReadModbusRtu[62];
Reads(PLC,1,MODBUS_RTU_REG_4X,0,62,arrReadModbusRt u);

Можно, не вопрос. А теперь попробуйте вот это:



// копируем DWORD PSW256-257 в PSW300-301
Reads(HMI_LOCAL_MCH, 0, TYPE_PSW, 256, 2, PSW[300]);


и это:



// копируем DWORD PSW256-257 в PSW300-301
Reads(HMI_LOCAL_MCH, 0, TYPE_PSW, 256, 2, &PSW[300]);


Чтобы не вдаваться в мало кому интересные подробности - в документации приведен универсальный вариант.

_Алексей_
28.08.2018, 13:36
Ясно,
а есть какие-то ограничения при написании скриптов - их размер например, или может быть что-то еще?

Евгений Кислов
28.08.2018, 13:38
Ясно,
а есть какие-то ограничения при написании скриптов - их размер например, или может быть что-то еще?

Да, есть ограничение на размер кода макросов:

СП307-Б/Р, СП310-Б/Р - 131072 байт
СП315-Р - 65536 байт

_Алексей_
28.08.2018, 13:42
А как определить размер?
Копируя код в блокнот например, и судить по размеру его файла?

Евгений Кислов
29.08.2018, 07:43
А как определить размер?
Копируя код в блокнот например, и судить по размеру его файла?

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