 | |
Предыдущие результаты
К сожалению, нет возможности применить модуль MCM. Нужно обойтись ADM'мом.. Подскажите, плиз, может кто знает, где найти программу для реализации ModBus, чтобы залить ее в модуль?
|
MVI56-ADM предназначен для свободного программирования, т.е. вы сами должны сначала написать программу, реализующую протокол Modbus, загрузить её в этот модуль, а уже после этого у вас дойдет до релейной логики.
Примеры с этим модулем в первую очередь показывают механизм взаимодействия с ним в шасси.
Для Modbus вам надо было брать модуль MVI56-MCM.
|
Всем доброго времени суток,
совсем недавно состоялось мое знакомство с модулем MVI56-ADM. Передо мной стоит задача разобраться в работе модуля по протоколу ModBus. Подскажите, пожалуйста, каковы основные принципы конфигурирования самого модуля, а также проекта (релейной логики).
На CD, который входит в комплект поставки, есть множество различных сэмплов, но ни слова про ModBus.
Заранее спасибо!
|
Дорогие специалисты
Покритикуйте мое видение в построении программ под pc совместимые контроллеры I-7000.
В данном случае I-7188EX + некоторые модули DI,DO.
Ниже буду описывать только те моменты которые правил руцями.
[b:0fdb64b409]Задачка такая:[/b:0fdb64b409]
- Написать программку управления очень примитивным технологическим процессом;
- Выдавать информацию наверх через ModBus TCP/IP;
[b:0fdb64b409]Мое решение[/b:0fdb64b409]
[b:0fdb64b409]1. Раз ModBus TCP/IP, то я взял скелет xserver подобной прошивки (один из примеров с диска);
2. Объявил чего то:[/b:0fdb64b409]
// Программа пользователя
void UserProg(int IN0,int IN1,int* TBL0,int *TimerCounter);
void UserSubProg1(int* TBL0);
// ModBus Таблица
unsigned char far iMemory_DI[100];
unsigned char far iMemory_DO[100];
int far iMemory_AI[100];
int far iMemory_AO[100];
int far iMemoryTemp[100];
int iCounter_Old; // Счетчик
int iUser_Old;
int iTimeSP_Old;
int TC;
int IN7063D_OLD = 0; // Определения фронта
int TBL13_OLD = 0; // Определения фронта
int iRet = 0;
// и.т.д.
[b:0fdb64b409]3. Реализовал программки:[/b:0fdb64b409]
// Подпрограмма пользователя
void UserSubProg1(int* TBL0)
{
// Тут логика какая-то
}
// Основная программа пользователя
void UserProg(int IN0,int IN1,int* TBL0,int *TimerCounter)
{
// Тут всякие алгоритмы управления тех. процессом
}
[b:0fdb64b409]4. Инициализацию построил в функции UserInit():[/b:0fdb64b409]
void UserInit(void)
{
int iRet;
int TC = 0;
//======= Begin of Modbus Kernel =======
iRet=InitModbus(iMemory_DI,iMemory_DO,iMemory_AI,iMemory_AO);
// В программе у меня есть данные которые нужно хранить при снятии питания с контроллера
iMemory_AO[9] = ReadNVRAM(0); // Читаем из 1-го байта энергонезависимой памяти
iMemory_AO[11] = ReadNVRAM(1); // Читаем из 2-го байта энергонезависимой памяти
iMemory_AO[13] = ReadNVRAM(2); // Читаем из 3-го байта энергонезависимой памяти
if(iRet==0)
{
// Initial Modbus configuration success.
}
else
{
// Initial Modbus configuration failure.
}
//======= End of Modbus Kernel=======
//Configure the COM port that links to the i-7000 modules.
// Сдесь эта функция нужна для работы монитора printCom
// При ее отсутствии в строку монитора ничего выводится не будет
SetBaudrate(1,115200L);
SetBaudrate(2,9600);
SetDataFormat(2,8,0,1);
Port9999=0; //Disable listening TCP port 9999 to speed up 7188E.
// Добавления таймера, реализующего поток
// Организовываю таймер, который будет вызывать мою програмку
// управления тех. процессом раз в TIMER_USERPROG_SP милисек.
AddUserTimerFunction(UserCount,TIMER_USERPROG_SP);
}
[b:0fdb64b409]5. В функции UserCount, организовал основной поток -
то что называется циклом выполнения программы пользователя.
В теле встречаются вызовы отдельных функций,
которые я реализовал в других си файлах[/b:0fdb64b409]
void UserCount(void)
{
int IN7063D = 0; // Образ всех входов модуля 7063D
int IN7053_FG = 0; // Образ всех входов модуля 7053_FG
//-------------------------------------------------------------------
// Читаем входной образ
//-------------------------------------------------------------------
IN7063D = ReadDI(2, "02",6000L);
IN7053_FG = ReadDI(2, "04",6000L);
//-------------------------------------------------------------------
// Программа пользователя
//-------------------------------------------------------------------
UserProg(IN7063D,IN7053_FG,iMemory_AO,&TC); // Чего то там передали
//-------------------------------------------------------------------
// Пишем входной образ в таблицу
//-------------------------------------------------------------------
if (IN7063D !=-1) iMemory_AI[0]=IN7063D; // В 0-й элемент массива _АI (по IEC стандарту адрес будет 30001) пишем образ входов
if (IN7053_FG!=-1) iMemory_AI[2]=IN7053_FG; // В 2-й элемент массива _АO (по IEC стандарту адрес будет 30003) пишем образ входов
//-------------------------------------------------------------------
// Пишем выходы + пишем выходной образ в таблицу
//-------------------------------------------------------------------
iRet = WriteDO_6063(2,"02",iMemory_AO[0],6000);
iRet = WriteDO70_4242D4343D(2,"06",iMemory_AO[2],6000);
//-------------------------------------------------------------------
// Сохраняем что-нибудь в энергонезависимую память
//-------------------------------------------------------------------
if(OnChange(iMemory_AO[9], &iCounter_Old)) WriteNVRAM(0,iMemory_AO[9]);
if(OnChange(iMemory_AO[11],&iTimeSP_Old)) WriteNVRAM(1,iMemory_AO[11]);
if(OnChange(iMemory_AO[13],&iUser_Old)) WriteNVRAM(2,iMemory_AO[13]);
}
Вроде бы работает, но только в Demo примерах - существуют разные концепции
проектирования прошивох на основании xserver шаблонов.
Прошу покритиковать вышеприведенный подход: особенно на вызов функции, реализующую алгоритм управления тех. процессом в теле функции UserCount.
ОГРОМНОЕ СПАСИБО !
|
Не совсем понятна сама проблема...
если бы автор конкретнее объяснил, что не получается, то ему самому стало бы понятнее...
MVI56-MCM - это в первую очередь протокол MODBUS, во вторую очередь - RS-485, и по-умолчанию порты у него в 232м режиме стоят...
добавить этот модуль в конфигурацию ввода-вывода мало, нужна еще программная обвязка для передачи конфигурации и данных, это все есть в примере
дальше надо конфигурировать порт мастера и соответствующие команды для него.
что из вышеперечисленного вы делали, а чего нет?
сужу, конечно, по себе... но там все очень просто и разобраться с примером можно не читая документации...
единственно, в документации коды ошибок нужны :)
вообще, стучитесь в аську, разрулим конкретные непонятки
|
MVI56-MCM - это модуль Master/Slave Communications Interface Module. Я исхожу из того, что ОВЕН МВА8 также висит на Modbus.
Является ли MVI56-MCM, а ОВЕН МВА8 - Slave?
Во всяком случае, имейте в виду такую особенность модуля MVI56-MCM: он удерживает данные и не будет генерировать никаких новых данных, даже нулей, до тех пор, пока не будет поступления новых данных из сети Modbus. Адресное пространство модуля можно обнулить только выключив и снова включив его питание.
|
Примите по ModBus два 16-битных слова. Попробуйте с помощью CPW скопировать два значения типа integer (16 бит) в два отдельных длинных 32-битных регистра.
Затем сдвиньте с помощью Bit Shift Left «верхнее» слово, занимающее 16 младших бит верхнего 32-битного регистра, влево. Они окажутся в верхней части регистра.
Затем с помощью маски, которая предохранит верхние 16 бит от перезаписи, добавьте из второго слова 16 младших бит. Возможно, получится то, что Вы хотите.
Потом можно с помощью CPW скопировать полученный реконструированный результат куда-нибудь во float. Только не забудьте указать длину 2.
[quote:f73a0d5de8]Может софт не выдает флоат значения. [/quote:f73a0d5de8] Может и не выдаёт.
|
Здравствуйте! Имеется стороннее устройство, данные с него выходят по MODBUS RTU. Решил данные собирать контроллером, т.к. железо понадежней будет софта.
Контроллер есть микро лоджик 1100.
0-вой порт сконфигурировал по модбас.
С помощью MSG инструкции читаю INTEGER данные.
В кач-ве источника пока использую софт (MODBUS SLAVE)- он в указанный порт шлет пакеты.
но вот при попытке прочитать FLOAT значения ничего не выходит, в моих ячейках флоат как были 0, так и есть,
В настройках:
size inelement 1, Data 32 (для интежер дата-16)
в чем может быть проблема? С модбасом почти не работал.
Может софт не выдает флоат значения.
Думал вытащить 2 интежер ячейки и с помощью функции COP (как я делал в SLC) из нескольких интежер получать 1 флоат, но в Mикролоджиках в функции COP файлы sourse и dest должны быть одного типа.
Неужели на микролоджике не получиться собрать данные? на SLC это на порядок будет дороже.
|
Обычно OPC-серверы для своих сетей поставляет производитель оборудования или независимый производитель (третья фирма).
ModBus - это не роквелловская сеть, поэтому возьмите, например, OPC-сервер от производителя контроллера, или любой другой.
Посмотрите, например, ресурсы на сайте Modbus: http://www.modbus.org/tech.php
Если Вас устраивает fastwel modbus opc server, то можно пользоваться и им.
|
ну да, на модбасе висит контроллер, Имеется RSView32, необходимо обмениваться данными м-у скадой и контроллером.
Что для этого необходимо?
Есть опыть работы в RSLogix 500, RSview32, а с OPC интерфесом не доводилось работать, да и с модбасом тоже. На сколько я понимаю нужен OPC сервер для модбаса, т.к. все остальное уже есть. Есть ли у роквела такой сервер, и стоит ли его брать? преимущества перед сторонними, и какой сами посоветуете?
Я из инета скачал демо fastwel modbus opc server, RSView32 его видит и соданный в нем тег тоже видит.
Что посоветуете реально рабочее и не оч. дорогое по деньгам, а может и бесплатные хорошие серверы можно где скачать?
|
Предыдущие результаты
Ещё результаты |
|
| |
|