Всем доброго дня. Стоит задача - нужно снять значение массы с весового индикатора CAS CI1560a в ПР200. На индикаторе RS232, на ПР200 RS485, ставим между ними преобразователь интерфейса. Настройку индикатора выставляем так: Использование последовательного порта - Подключение к компьютеру или удаленному дисплею, Номер устройства - 01 (написано в мануале, что это номер необходим для формирования сигнала при посл. передаче данных), Скорость - 9600, Установка для передачи данных - Непрерывная.
Настройка прибора в ПР200 согласно мануалу индикатора - скорость совпадает, биты данных 8, стоповый бит 1, проверка четности нет, кодировка ASCII.
На этом форуме подсмотрел программку Просто весы, на ее основе сваял свою - не работает. Кто может - помогите пожалуйста. Что я сделал не так?
22.11.2018, 17:05
petera
Цитата:
Сообщение от po525
Всем доброго дня. Стоит задача - нужно снять значение массы с весового индикатора CAS CI1560a в ПР200. На индикаторе RS232, на ПР200 RS485, ставим между ними преобразователь интерфейса. Настройку индикатора выставляем так: Использование последовательного порта - Подключение к компьютеру или удаленному дисплею, Номер устройства - 01 (написано в мануале, что это номер необходим для формирования сигнала при посл. передаче данных), Скорость - 9600, Установка для передачи данных - Непрерывная.
Настройка прибора в ПР200 согласно мануалу индикатора - скорость совпадает, биты данных 8, стоповый бит 1, проверка четности нет, кодировка ASCII.
На этом форуме подсмотрел программку Просто весы, на ее основе сваял свою - не работает. Кто может - помогите пожалуйста. Что я сделал не так?
Установка для передачи данных - Непрерывная. - похоже это означает, что весы сами всегда шлют данные а ПК их должен обрабатывать.
Тогда при чем тут ПР ? он так не умеет
23.11.2018, 14:26
po525
Цитата:
Сообщение от melky
Установка для передачи данных - Непрерывная. - похоже это означает, что весы сами всегда шлют данные а ПК их должен обрабатывать.
Тогда при чем тут ПР ? он так не умеет
На выбор еще есть:
Передача в установившемся состоянии
Передача по запросу
Выбирать По запросу?
А что насчет протокола? Это на самом деле так - все может не работать из-за протокола?
Если не работает из-за протокола - может тогда нужно поставить МВ110 и поставить переключатель чтобы при необходимости можно было перейти на весовой индикатор?
23.11.2018, 14:31
melky
да, должно быть выполнено 2 условия, как заметили выше протокол тоже важен.
ПР для данных весов не подходит из-за протокола. Если читать при помощи ПК или ПЛК то надо выставить "По запросу"
23.11.2018, 14:44
petera
Могу подключить CAS CI-1560A к панели СП270 или СП3хх, если надо.
ЗЫ
А уж из СП270 в ПРку - как два пальца..
12.12.2018, 16:08
petera
Вложений: 7
Попытка подключить CAS CI-1560A к ПРке с помощью панели СП3хх
Идея заключается в том, что
- CAS CI-1560A подключен к порту панели Download
- ПР200 подключено к порту панели PLC
в панели работает макрос на Си, который по запросу получает из CAS CI-1560A 22 байта следующего формата Вложение 40337
байты 1, 2 - символы US или ST или OL
байт 3 - символ ","
байты 4, 5 - GS или NT
байт 6 - символ ","
байт 7 - номер устройства
байт 8 - состояние ламп на панели CAS1560
байт 9 - символ ","
байты 10, 11, 12, 13, 14, 15, 16, 17 - ascii коды цифр веса
байт 18 - символ "пробел"
байт 19 - символ "К"
байт 20 - символ "G"
байт 21 - символ CR
байт 22 - символ LF
Макрос ищет в строке байты 10, 11, 12, 13, 14, 15, 16, 17, преобразовывает эту подстроку в число и отправляет его в ПР по модбасу
в байте 10 - знак числа, а в 11, 12, 13, 14, 15, 16, 17 цифры
Теперь сам проект Вложение 40340
Два дисплея PSW500 и PSW501 нужны только для отладки - число полученных байт и число повторов чтения из CAS1560.
Весы подключены к порту Download, параметры порта в проекте 19200, 8, нет, 1. Сделать для весов такие же настройки.
ПР200 подключается к порту PLC, 115200, 8, нет, 1
Сам макрос вызывается ф.областью, ГЛОБАЛЬНОЙ, условие запуска - непрерывно.
Режим выполнения макроса - параллельный! Вложение 40342
Выделенные части нужны только для демонстрации работы макроса их можно удалить.
Макрос посылает запрос в CAS1560 на передачу данных (посылается один байт с номером, который присвоен CAS1560) , читает 22 байта ответа. Если CAS1560 не отвечает (тайм-аут сделан 1сек), то делается еще две попытки чтения. Если ответа нет - устанавливается флаг ошибки, через 3 сек флаг сбрасывается и чтение выполняется заново.
Флаг ошибки можно использовать в алгоритме ПР, для остановки процесса дозирования.
У меня от этого флага срабатывает сигнальное окно.
Из полученной строки выделяются семь символов веса и преобразовываются в число со знаком, формат short int.
Допустимый диапазон веса получается от - 32768 до +32767 кг. Надеюсь, что 32 тонны достаточно?
Макрос:
Код:
#define Alarm 300 // Number PSB from error flag
#define NumCAS 1 //ID device
#define adrPR 16 // Addres PR200
#define adrRegPR 512 // Addres register "Weight"
WORD timeOut;
WORD status = 0;
BYTE ID[1];
BYTE byArr[22] = {' '};
char *strWeight = " 0";
int i = 0;
short int Weight = 0;
//---- change timeout port of PLC (only for ModBus)
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, &timeOut);
if(timeOut == 1000) Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, 200);
//-----send a request for data from the CAS1560
Enter(DOWNLOAD); // open port DOWNLOAD
ID[0] = NumCAS;
Send(DOWNLOAD, ID, 1); //send ID device
//----- Get string (22 bytes) from CAS1560
while(status != 22 && i < 3) {
status = Receive(DOWNLOAD, byArr, 22, 1000, 18);
i++; //next try
PSW[500] = status; //debug only !!
PSW[501] = i; //debug only !!
}
//----
memcpy(strWeight, byArr +10, 7); //extract string weight
Weight = atoi(strWeight); //convert string to number
if (byArr[9] == '-') Weight = Weight * (-1);
//----
PSW[314] = Weight; //debug only !!
memcpy(&PSW[300], byArr, 22); //debug only !!
//--- if three attempts were unsuccessful, set error flag for three seconds
if (i == 3 && status != 22) {
SetPSB(Alarm);
Delay(3000);
ResetPSB(Alarm);
}
Leave(DOWNLOAD); //close port DOWNLOAD
//Delay(100);
//--- write weight in the register PR200
Write(PLC, adrPR, MODBUS_RTU_REG_4X, adrRegPR, 0, TYPE_WORD, Weight);
параметры работы макроса задаются в секции #define
Код:
#define Alarm 300 // Number PSB from error flag
#define NumCAS 1 //ID device
#define adrPR 16 // Addres PR200
#define adrRegPR 512 // Addres register "Weight"
Тут, что и зачем вроде понятно
секция
Код:
//---- change timeout port of PLC (only for ModBus)
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, &timeOut);
if(timeOut == 1000) Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, 200);
Т.к. число передаваемое в ПР будет 16битным целым со знаком, а ПР не умеет делать арифметику с такими числами, то полученное число нужно преобразовать в число с плавающей запятой. Вложение 40344
У меня здесь такой макрос Вложение 40343
13.12.2018, 10:38
Ревака Юрий
Цитата:
Сообщение от petera
Попытка подключить CAS CI-1560A к ПРке с помощью панели СП3хх
Идея заключается в том, что
- CAS CI-1560A подключен к порту панели Download
- ПР200 подключено к порту панели PLC
в панели работает макрос на Си, который по запросу получает из CAS CI-1560A 22 байта следующего формата Вложение 40337
байты 1, 2 - символы US или ST или OL
байт 3 - символ ","
байты 4, 5 - GS или NT
байт 6 - символ ","
байт 7 - номер устройства
байт 8 - состояние ламп на панели CAS1560
байт 9 - символ ","
байты 10, 11, 12, 13, 14, 15, 16, 17 - ascii коды цифр веса
байт 18 - символ "пробел"
байт 19 - символ "К"
байт 20 - символ "G"
байт 21 - символ CR
байт 22 - символ LF
Макрос ищет в строке байты 10, 11, 12, 13, 14, 15, 16, 17, преобразовывает эту подстроку в число и отправляет его в ПР по модбасу
в байте 10 - знак числа, а в 11, 12, 13, 14, 15, 16, 17 цифры
Теперь сам проект Вложение 40340
Два дисплея PSW500 и PSW501 нужны только для отладки - число полученных байт и число повторов чтения из CAS1560.
Весы подключены к порту Download, параметры порта в проекте 19200, 8, нет, 1. Сделать для весов такие же настройки.
ПР200 подключается к порту PLC, 115200, 8, нет, 1
Сам макрос вызывается ф.областью, ГЛОБАЛЬНОЙ, условие запуска - непрерывно.
Режим выполнения макроса - параллельный! Вложение 40342
Выделенные части нужны только для демонстрации работы макроса их можно удалить.
Макрос посылает запрос в CAS1560 на передачу данных (посылается один байт с номером, который присвоен CAS1560) , читает 22 байта ответа. Если CAS1560 не отвечает (тайм-аут сделан 1сек), то делается еще две попытки чтения. Если ответа нет - устанавливается флаг ошибки, через 3 сек флаг сбрасывается и чтение выполняется заново.
Флаг ошибки можно использовать в алгоритме ПР, для остановки процесса дозирования.
У меня от этого флага срабатывает сигнальное окно.
Из полученной строки выделяются семь символов веса и преобразовываются в число со знаком, формат short int.
Допустимый диапазон веса получается от - 32768 до +32767 кг. Надеюсь, что 32 тонны достаточно?
Макрос:
Код:
#define Alarm 300 // Number PSB from error flag
#define NumCAS 1 //ID device
#define adrPR 16 // Addres PR200
#define adrRegPR 512 // Addres register "Weight"
WORD timeOut;
WORD status = 0;
BYTE ID[1];
BYTE byArr[22] = {' '};
char *strWeight = " 0";
int i = 0;
short int Weight = 0;
//---- change timeout port of PLC (only for ModBus)
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, &timeOut);
if(timeOut == 1000) Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, 200);
//-----send a request for data from the CAS1560
Enter(DOWNLOAD); // open port DOWNLOAD
ID[0] = NumCAS;
Send(DOWNLOAD, ID, 1); //send ID device
//----- Get string (22 bytes) from CAS1560
while(status != 22 && i < 3) {
status = Receive(DOWNLOAD, byArr, 22, 1000, 18);
i++; //next try
PSW[500] = status; //debug only !!
PSW[501] = i; //debug only !!
}
//----
memcpy(strWeight, byArr +10, 7); //extract string weight
Weight = atoi(strWeight); //convert string to number
if (byArr[9] == '-') Weight = Weight * (-1);
//----
PSW[314] = Weight; //debug only !!
memcpy(&PSW[300], byArr, 22); //debug only !!
//--- if three attempts were unsuccessful, set error flag for three seconds
if (i == 3 && status != 22) {
SetPSB(Alarm);
Delay(3000);
ResetPSB(Alarm);
}
Leave(DOWNLOAD); //close port DOWNLOAD
//Delay(100);
//--- write weight in the register PR200
Write(PLC, adrPR, MODBUS_RTU_REG_4X, adrRegPR, 0, TYPE_WORD, Weight);
параметры работы макроса задаются в секции #define
Код:
#define Alarm 300 // Number PSB from error flag
#define NumCAS 1 //ID device
#define adrPR 16 // Addres PR200
#define adrRegPR 512 // Addres register "Weight"
Тут, что и зачем вроде понятно
секция
Код:
//---- change timeout port of PLC (only for ModBus)
Read(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, &timeOut);
if(timeOut == 1000) Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 38, 0, TYPE_WORD, 200);
Т.к. число передаваемое в ПР будет 16битным целым со знаком, а ПР не умеет делать арифметику с такими числами, то полученное число нужно преобразовать в число с плавающей запятой. Вложение 40344
У меня здесь такой макрос Вложение 40343
Дороговатый преобразователь получился:D
13.12.2018, 11:00
petera
Цитата:
Сообщение от Ревака Юрий
Дороговатый преобразователь получился:D
Панель в проекте присутствует изначально, для ввода рецептов, слежения за процессом и пр.
по этому мой макрос на цену всего изделия не влияет
13.12.2018, 14:15
Scream
Я ставил raspberry pi для 6 весов CAS, весы настроены были на отдачу веса по ID, и по одной линии rs485 опрашивал все 6 весов.
Преобразователь получался с БД и web через node-red по цене 4 т.р. Работало не плохо.