PDA

Просмотр полной версии : СП307 и МУ110-224.8Р



Anchar
22.04.2022, 09:29
Здравствуйте. Прошу помочь с написанием макроса сигнализации. К панели подключен модуль МУ110, включающий сигнальную лампу в случае превышения уставки. Используется макрос
WORD A=3;
if (PSW[256]>=A)
{
Write(PLC, 2, MODBUS_RTU_REG_4X, 50, 0, TYPE_BIT, 1);
}
else
{
Write(PLC, 2, MODBUS_RTU_REG_4X, 50, 0, TYPE_BIT, 0);
}
Если при помощи функциональной области включить PWF 36.2, то все работает. Но к панели еще подключены несколько частотников, для которых используется команда х06. Подскажите как при помощи макроса управлять МУ не трогая PWF 36.2?

petera
22.04.2022, 09:30
Здравствуйте. Прошу помочь с написанием макроса сигнализации. К панели подключен модуль МУ110, включающий сигнальную лампу в случае превышения уставки. Используется макрос
WORD A=3;
if (PSW[256]>=A)
{
Write(PLC, 2, MODBUS_RTU_REG_4X, 50, 0, TYPE_BIT, 1);
}
else
{
Write(PLC, 2, MODBUS_RTU_REG_4X, 50, 0, TYPE_BIT, 0);
}
Если при помощи функциональной области включить PWF 36.2, то все работает. Но к панели еще подключены несколько частотников, для которых используется команда х06. Подскажите как при помощи макроса управлять МУ не трогая PWF 36.2?

Сформировать в макросе команду "0х10" модбас вместо стандартной функции Write()

ЗЫ.
Делал когда-то для СП270 и МУ

//В примере адрес устройства равен 176
//Данные с маской выхoдов МУ в регистре PSW300
//*************************************************
BYTE snd[11]={0xB0,0x10,0x00,0x32,0x00,0x01,0x02};//буфер для посылки команды slave
//[0]-адрес устройства(0xB0) 176
//[1]-Код функции ModbusRTU 0x10 -запись нескольких регистров
//[2]-ст.байт адреса начального регистра(0x00)
//[3]-мл.байт адреса начального регистра(0x32) 50
//[4]-ст.байт количества регистров(0x00)
//[5]-мл.байт количества регистров(0x01)
//[6]-количество байтов(0x02)
//[7]-ст.байт значения в регистре(Определим ниже)
//[8]-мл.байт значения в регистре(Определим ниже)
//[9]-ст.байт CRC(Определим ниже)
//[10]-мл.байт CRC(Определим ниже)

BYTE rcv[8];//буфер для приема ответа от slave
//[0]-адрес устройства
//[1]-Код функции ModbusRTU-чтение нескольких регистров 0x10
//[2]-ст.байт адреса начального регистра(0x00)
//[3]-мл.байт адреса начального регистра(0x32)
//[4]-ст.байт количества регистров(0x00)
//[5]-мл.байт количества регистров(0x01)
//[6]-ст.байт CRC
//[7]-мл.байт CRC

snd[7]=HIBYTE(PSW[300]);
snd[8]=LOBYTE(PSW[300]);
snd[9]=HIBYTE(Crc(snd,9));//дополнить команду CRC, сначала Hi
snd[10]=LOBYTE(Crc(snd,9));//затем Lo
//Crc() -внутренняя функция, ее писать не надо

Enter(PLC);//Захватить порт PLC
Send(PLC,snd,11);//Отправить команду
Receive(PLC,rcv,8,1000,6);//Получить ответ (тайм-аут 1000мс)
Leave(PLC);//Освободить порт

Anchar
22.04.2022, 09:41
К сожалению, я не программист. Не могли бы Вы пояснить как сформировать такую команду при помощи макроса.

petera
22.04.2022, 09:50
К сожалению, я не программист. Не могли бы Вы пояснить как сформировать такую команду при помощи макроса.
https://owen.ru/forum/attachment.php?attachmentid=11962&d=1392751544
Текст макроса привел выше!

petera
22.04.2022, 10:04
Ниже полный код макроса для модуля МУ110, включающий сигнальную лампу в случае превышения уставки.



// (c) PeterA
//В примере адрес устройства равен 2
//*************************************************
BYTE snd[11]={0x02,0x10,0x00,0x32,0x00,0x01,0x02};//буфер для посылки команды slave
//[0]-адрес устройства(0x02) 2
//[1]-Код функции ModbusRTU 0x10 -запись нескольких регистров
//[2]-ст.байт адреса начального регистра(0x00)
//[3]-мл.байт адреса начального регистра(0x32) 50
//[4]-ст.байт количества регистров(0x00)
//[5]-мл.байт количества регистров(0x01)
//[6]-количество байтов(0x02)
//[7]-ст.байт значения в регистре(Определим ниже)
//[8]-мл.байт значения в регистре(Определим ниже)
//[9]-ст.байт CRC(Определим ниже)
//[10]-мл.байт CRC(Определим ниже)

BYTE rcv[8];//буфер для приема ответа от slave
//[0]-адрес устройства
//[1]-Код функции ModbusRTU-чтение нескольких регистров 0x10
//[2]-ст.байт адреса начального регистра(0x00)
//[3]-мл.байт адреса начального регистра(0x32)
//[4]-ст.байт количества регистров(0x00)
//[5]-мл.байт количества регистров(0x01)
//[6]-ст.байт CRC
//[7]-мл.байт CRC

WORD A=3;

//Тут начало алгоритма
snd[7]= 0; //ст.байт маски
if (PSW[256]>=A) {
snd[8]= 1; //мл.байт маски
snd[9]=HIBYTE(Crc(snd,9));//дополнить команду CRC, сначала Hi
snd[10]=LOBYTE(Crc(snd,9));//затем Lo
//Crc() -внутренняя функция, ее писать не надо
}
else {
snd[8]= 0; //мл.байт маски
snd[9]=HIBYTE(Crc(snd,9));//дополнить команду CRC, сначала Hi
snd[10]=LOBYTE(Crc(snd,9));//затем Lo
//Crc() -внутренняя функция, ее писать не надо
}
Enter(PLC);//Захватить порт PLC
Send(PLC,snd,11);//Отправить команду
Receive(PLC,rcv,8,1000,6);//Получить ответ (тайм-аут 1000мс)
Leave(PLC);//Освободить порт

Anchar
22.04.2022, 10:48
Огромное спасибо. Все работает!