Диссертация на соискание ученой степени кандидата технических наук Владимирский государственный университет
Скачать 6.36 Mb.
|
ac/dc *24b/sa +24B -*■ KOHTpOlintf idc/dc +24вла =22св ас® с +24bsa KOHTppfb Краны Датч-*и AC/DC HI OB/2,SA acidc +1108)12,» dc/dc +24вла +1108 АСФС - LWRI401, LWRJH80 DC.BC - F-MPU?5t Рисунок 3.1. Типовая схема распределения электропитания в НТК «ПХВ-1» Защитное заземление Контур защитного заземления ПТК «ПХВ-1» соединяется по типу с глухозаземленной нейтралью для основного оборудования, расположенного на базовой площадке, и по типу с изолированной нейтралью для периферийных площадок. Контур защитного заземления с сопротивлением растеканию тока не более 4 Ом объединяется с рабочим заземлением на уровне распределительных коробок либо составляет общее рабочее заземление. Типовая схема заземления шкафного оборудования в ПТК «ПХВ-1» представлена на Рисунок 3.2 . Защитные барьеры Защита цепей питания, измерительных и информационных каналов ПТК «ПХВ-1» от электромагнитных помех, перенапряжений, вторичных проявлений грозовых токов и возникновение искры во взрывоопасной зоне осуществляется защитными барьерами искробезопасности. Для защиты цепей питания, измерительных и информационных каналов от вторичных воздействий молний в шкафах автоматики применяются грозозащитные барьеры (ГЗБ). Для защиты измерительных каналов, находящихся во взрывоопасной зоне, применяются датчики во взрывобезопасном исполнении (Ехс1), а в шкафах автоматики преобразователи со встроенными искробезопасными барьерами (ИББ). - кпеммник земл,"ьсй 2 - клеммник про^од-ш 3- &ыключатегь^отс(.ит 4 - шина оаземлешя 5- несздейетвоеанныйгроеод 6 - изолированный регъе Рисунок 3.2. Пример заземления шкафного оборудования ПТК «ПХВ-1» Примечание. КЗЗ - контур г-аицггного заземпа-мя РАСПРЕДЕЛИТЕЛЬНЫМ ЩИТ ШКАФ ШШ Блоки питания и преобразователи со встроенными ИББ устанавливаться в шкафу автоматики на рельсе или металлоконструкции, которые соединяются с контуром защитного заземления с помощью заземляющего проводника сопротивлением не более 1 Ом . Шкафное оборудование На рынке предложений шкафного оборудования высокую конкурентоспособность имеет оборудование фирмы RITTAL. Шкафы по пылевлагозащищенности соответствует международным стандартам, степень защиты IP54, высокая технологичность при сборке, широкая номенклатура составных частей и принадлежностей. Шкафы ПТК «ПХВ-1» подразделяются на три типа по функциональному назначению: шкаф фронтального контроллера напольный; шкаф автоматики напольный; шкаф автоматики настенный. По конструктивному назначению шкафы ПТК подразделяются на два типа: шкаф напольный типа DK7771 фирмы RITTAL; шкаф настенный типа АЕ1260 фирмы RITTAL. Блок аварийного останова Система безопасности рабочего персонала и эксплуатационного оборудования распределенных АСУ ТП базируется на применении блока экстренного аварийного останова (БЭАО). БЭАО ПТК «ПХВ-1» является распределенным аппаратным устройством, который включает следующие узлы: пульт БЭАО; основной управляющий и исполнительный (релейный) узел распределенной схемы БЭАО в шкафу цехового контроллера или отдельном шкафу контроллера БЭАО; контроллер БЭАО; узел управляющих и исполнительных реле в шкафу локального контроллера узла подключения (УП); узел управляющих и исполнительных реле в шкафу локального контроллера общестанционных замеров и кранов (ОЗК); узел управляющих и исполнительных реле в шкафу локального контроллера блока подготовки сырья (БПС); кроссовый узел в шкафу локального контроллера аппаратов воздушного охлаждения (ABO); кроссовый узел в системе автоматического управления напыляющими агрегатами САУ НА; коммутационные цепи БЭАО. БЭАО функционирует в 2-х режимах: экстренный аварийный останов цеха, агрегатов, выполняемый аппаратным способом, использующий только физические связи; аварийный останов цеха, выполняемый программно-аппаратным способом по алгоритмам с учетом всех условий и технологических зависимостей. Аварийный останов инициализируется по команде оператора с пульта БЭАО или АРМ при возникновении аварийных ситуаций, таких как пожар на станции, превышение температуры сырья в котле, выход за пределы уставок на секущем кране, пропадание основного электропитания, обрыв собственных обеих резервных цепей БЭАО. Исходя из последней посылки, проектирование БЭАО одна из самых ответственных задач в проекте ПТК «ПХВ-1». Документация Для ПТК «ПХВ-1» разрабатывается и предоставляется пользователю следующая документация: Общесистемная документация: общее описание ПТК (ПД); инструкция по эксплуатации КТС (ИЭ); руководство по системной поддержке (ИЭ); описание программного обеспечения (ПА); ведомость машинных носителей информации. На фронтальные и локальные ПЛК: сборочный чертёж (СБ); схема электрическая принципиальная (ЭЗ); таблица соединений (ТЭ4); таблица подключения ( ТЭ5); ведомость покупных изделий (ВП); ведомость ЗИП; паспорт (ПС); ведомость эксплуатационных документов (ВЭ); руководство по эксплуатации (РЭ); руководство программиста (РП); перечень элементов ПЭЗ. На АРМ: Руководство пользователя (ИЗ); Чертежи видеокадров (ИЗ); Описание программного обеспечения. Документация оформляется в соответствии с требованиями ЕСКД и ЕСПД. На составные компоненты импортного производства пользователю предоставляется эксплуатационная документация на русском языке. На ПТК «ПХВ-1» выпущены и действуют технические условия. ПРИЛОЖЕНИЕ 7 Код основного модуля программы MODBUS_MASTER //****************************************************************************** //******************************** MODBUS MASTER ******************************* //****************************************************************************** iinclude "comport.h" iinclude "crclrc.h" ttinclude "modbus.h" ttinclude #ifdef WIN32 /************** секция WINDOWS ****************/ ttdefine usleep(delay) Sleep(delay/1000) #endif #include unsigned char _mod_buffer[260]; unsigned char _mod_ascii_buffer[MAX_ASCII_BUF]; enum DebugDataType{ DATA_DEC, DATA_HEX, DATA_OCT, DATA_BIN, DATA_FLOAT }; int __mod__debugType = DATA_HEX; // глобальные переменные int __mod_debugState = MOD_DEBUG_OFF; // управление выполнением int _mod_protocol_type = MODBUS_DEFAULT; // программы //struct timeb _mod_ResponseTime; // время записи в устройство и время ответа операции MODBUS long _mod_responseTime; // время ответа в миллисекундах //float _mod_charPS = 0; // 1/(( baud rate ) / ( длина в битах )) // // function pointers - используются когда установлен режим DEBUG или ASCII int (*_mod_procSendDataToDevice)(unsigned char devNum, unsigned char command, unsigned int count) = _mod_SendDataToDeviceRTU; int (*_mod_procGetDataFromDevice)(unsigned char devNum, unsigned char **data, unsigned long *count) = _mod_GetDataFromDeviceRTU; int (*_mod_procRecieveData)(unsigned short *crcRet, int *exErrorCode) = _mod_RecieveData; int (*_mod_procTransmitData)(int count) = _mod_TransmitData; /*int (*_mod_procRecieveDataASCII)(unsigned short *crcRet, int *exErrorCode) = _mod_RecieveDataASCII; int (*_mod_procTransmitDataASCII)(int count) = _mod_TransmitDataASCII;*/ // // Сканирование сети MODBUS int ScanModBus(LPMODBUSDEVICE device) { register int i=MAX_DEVICE_COUNT,j=0; unsigned char *dataPtr; unsigned long nCount; int dbgType = GetModBusDebugType(); int dbgState = GetModBusDebugState(); // Запрет операции отладки функции IO до начала сканирования // if (dbgState == MOD_DEBUG_ON) // ModBusDebugEnable(0,0); printf("%d\n", dbgState) ; while(—i){// Сканирование всей сети MODBUS функцией 0x11 if (SendDataToDevice(i,0x11,0) != SUCCESSFUL) continue; if (GetDataFromDevice(i, SdataPtr, SnCount) == SUCCESSFUL) { device[j].devAddr = i; device[j].devID = *(dataPtr + 3); } usleep(50000); } // Выполнение операции отладки, если она разрешена // if (dbgState == MOD_DEBUG_ON) // ModBusDebugEnable(1,dbgType); return j; } / / Получить идентификатор устройства int GetDevicelD(unsigned char devNum, LPMODBUSDEVICE device) { register int res; unsigned char *dataPtr; unsigned long nCount; int dbgType = GetModBusDebugType(); int dbgState = GetModBusDebugState(); // Запрет операции отладки функции IO до начала сканирования // if (dbgState == MOD_DEBUG_ON) // ModBusDebugEnable(0,0); / / Посылаем функцию 0x11 для получения информации об устройстве SendDataToDevice(devNum,0x11,0); if ((res = GetDataFromDevice(devNum,SdataPtr,SnCount)) == SUCCESSFUL){ / / Полученные данные записываем в структуру device->devAddr = devNum; device->devID = *(dataPtr + 3); } usleep(50000); // Выполнение операции отладки, если она разрешена // if (dbgState == MOD_DEBUG_ON) / / ModBusDebugEnable(1, dbgType); return res; } / / Проверка на наличие устройства с номером devNum в списке найденных устройств int IsDevicelnList(unsigned char devNum,LPMODBUSDEVICE device,int devCount) ( register int i = devCount, j=0; while(i—){ if (devNum==device[j].devAddr) return 0; } return -1; } / / Чтение дискретных выходов устройства int ReadDiscreteOut(unsigned char devNum, unsigned long startAddr, unsigned long count, unsigned char **data, unsigned long *nBytes) { register int res; unsigned char *dataPtr; unsigned long nCount; unsigned short *ptr = (unsigned short *)GetDataPtr(); *ptr = EndianSwap (startAddr) ; // Переставим старшие и младшие байты *(ptr+1) = EndianSwap (count) ; // адреса и счетчика / / Пошлем данные устройству if ((res = SendDataToDevice(devNum,0x01,4))!=SUCCESSFUL) return res; / / Считаем данные из устройства if ((res = GetDataFromDevice(devNum, SdataPtr, SnCount)) !=SUCCESSFUL) return res; *data = dataPtr+3; // data - Содержит битовый ряд с положением дискретных выходов каналов *nBytes = * (dataPtr+2) ; // - Количество значащих бит в полученном массиве return res; } // Не удалось проверить, т.к. функция не работает в ПКЦ12 int ReadDiagnostic(unsigned char devNum,unsigned short *value) { register int res; unsigned char *dataPtr = GetDataPtr(); unsigned long nCount; *dataPtr = 0x00; *(dataPtr+1) = 0x02; *(dataPtr+2) = 0x00; *(dataPtr+3) = 0x00; // *ptr = 0x0002; // *(ptr+1) = 0x0000; if ((res = SendDataToDevice(devNum,0x08,4))!=SUCCESSFUL) return res; if ((res = GetDataFromDevice(devNum,SdataPtr,&nCount))!=SUCCESSFUL) return res; *value = EndianSwap(*((unsigned short *)(dataPtr+4))); return res; } // He удалось проверить, т.к. функция не работает в ПКЦ12 int ClearDiagnostic(unsigned char devNum) { register int res; unsigned char *dataPtr = GetDataPtr(); unsigned long nCount; *dataPtr = 0x00; *(dataPtr+1) = 0x01; *(dataPtr+2) = OxFF; *(dataPtr+3) = 0x00; // *ptr = 0x0002; // *(ptr+1) = 0x0000; if ((res = SendDataToDevice(devNum,0x08,4))!=SUCCESSFUL) return res; if ((res = GetDataFromDevice(devNum,SdataPtr,SnCount))!=SUCCESSFUL) return res; return res; } // Чтение группы регистров устройства / / Параметры: // devNum - номер устройства на шине MODBUS // startAddr - начальный адрес регистра устройства // count - количество регистров подлежащих прочтению // data - возвращается указатель на прочитанные данные // nRegs - количество прочитанных регистров int ReadRegisters(unsigned char devNum, unsigned long startAddr, unsigned long count, unsigned short **data, unsigned long *nRegs) { register int res; unsigned char *dataPtr; unsigned long nCount; unsigned short *ptr = (unsigned short *)GetDataPtr(); *ptr = EndianSwap(startAddr); *(ptr+l) = EndianSwap(count); if ((res = SendDataToDevice(devNum,0x03,4))!=SUCCESSFUL) return res; if ((res = GetDataFromDevice(devNum,SdataPtr,SnCount))!=SUCCESSFUL) return res ; ptr = (unsigned short *)(dataPtr+3); *data = ptr; *nRegs = (*(dataPtr+2)) » 1; /* i=*nRegs; do{ *ptr = EndianSwap(*ptr); ptr++; }while(—i);*/ return res; } // Чтение группы 32-х разрядных регистров устройства / / Параметры: // devNum - номер устройства на шине MODBUS // startAddr - начальный адрес регистра устройства // count - количество регистров подлежащих прочтению // data - возвращается указатель на прочитанные данные // nRegs - количество прочитанных регистров int ReadRegisters32(unsigned char devNum, unsigned long startAddr, unsigned long count, unsigned long **data, unsigned long *nRegs) { register int res; unsigned char *dataPtr; unsigned long nCount; unsigned short *ptr = (unsigned short *)GetDataPtr(); *ptr = EndianSwap(startAddr); *(ptr+l) = EndianSwap (count«l ) ; if ((res = SendDataToDevice(devNum,0x03,4))!=SUCCESSFUL) return res; if ((res = GetDataFromDevice(devNum,SdataPtr,SnCount))!=SUCCESSFUL) return res; ptr = (unsigned short *)(dataPtr+3); *data = (unsigned long *)ptr; *nRegs = (*(dataPtr+2)) >> 2; /* i=*nRegs; do { *ptr = EndianSwap(*ptr); *(ptr+l) = EndianSwap(*(ptr+l)); ptr+=2; }while(—i);*/ return res; } |