Страница 56 из 94 ПерваяПервая ... 646545556575866 ... ПоследняяПоследняя
Показано с 551 по 560 из 931

Тема: Панели оператора СП270. Вопросы и ответы

  1. #551
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841
    Последний раз редактировалось petera; 28.10.2014 в 15:11.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #552

    По умолчанию

    Насколько я понимаю, соответствие RS-485 будет обеспечено терминалом при передаче (если порт правильно настроен), а соответствие стандарту Modbus и правильность ответа проверяет уже скрипт.
    Вот новая функция, проверить по-прежнему нет возможности
    Код:
    const BYTES_PER_REG = 2;
    const N_RETRIES = 3;
    const RETRY_TIMEOUT = 1000; //ms
    BOOL MWrites(int comID, int staID, int objType, int add1, int regs, void* pRegs) {
    	BYTE bSend[256], bRecieve[256], i;
    	WORD bBytesToSend = 0, bBytesRecieved = 65535;
    	BYTE nRetry = N_RETRIES; //Количество попыток повтора
    	BYTE offset_PSW_log;
    	int CrcSum;
    	
    	switch (comID) {
    	case DOWNLOAD:
    		offset_PSW_log = 60;
    		break;
    	case PLC:
    		offset_PSW_log = 70;
    		break;
    	default:
    		return Writes(comID, staID, objType, add1, regs, pRegs); //don't know what to do
    	}
    	
    	bSend[0] = staID;
    	switch (objType) {
    	case MODBUS_RTU_REGS_4X:
    		bSend[1] = 0x10;
    		break;
    	default:
    		return Writes(comID, staID, objType, add1, regs, pRegs); //don't know what to do
    	}
    	bSend[2] = HIBYTE(add1);
    	bSend[3] = LOBYTE(add1);
    	bSend[4] = HIBYTE(regs);
    	bSend[5] = LOBYTE(regs);
    	bSend[6] = regs * BYTES_PER_REG;
    	bBytesToSend = 7;
    	
    	for (i=0; i<regs*2; i++) {
    		bSend[bBytesToSend] = ((BYTE*)pRegs)[i];
    		bBytesToSend++;
    	}
    	
    	CrcSum = Crc(bSend, bBytesToSend);
    	bSend[bBytesToSend] = LOBYTE(CrcSum);
    	bSend[bBytesToSend + 1] = HIBYTE(CrcSum);
    	bBytesToSend += 2;
    	
    	if (bBytesToSend > 256)
    		return FALSE;
    	
    	Enter(comID);//Захватить порт PLC
    	do {
    		if (bBytesRecieved != 65535) { //Была ошибка связи
    			PSW[offset_PSW_log+1]++;
    			if (bBytesRecieved != 0) // Ошибка данных
    				PSW[offset_PSW_log+3]++;
    			//else //Таймаут
    			//	PSW[offset_PSW_log+2]++;
    		}
    		
    		Send(comID, bSend, bBytesToSend);//Отправить команду
    		bBytesRecieved = Receive(comID, bRecieve, 256, RETRY_TIMEOUT, 6);//Получить ответ (тайм-аут 1000мс)
    	} while ((bBytesRecieved == 0 || //Если данные получены
    		bRecieve[0] != staID || //От правильного устройства
    		bRecieve[1] != bSend[1] || //Правильной функцией
    		MAKEWORD(bRecieve[3], bRecieve[2]) != add1 || // По правильному адресу
    		MAKEWORD(bRecieve[5], bRecieve[4]) != regs || // Правильное количество регистров
    		Crc(bRecieve, bBytesRecieved) != 0 //Контрольная сумма в порядке 
    	) && (nRetry--)>0); //... то всё ок, иначе отнимаем попытку и, если они остались, пытаемся ещё
    	Leave(comID);//Освободить порт
    	
    	if (nRetry>0) { //Если попытки остались, значит, последняя попытка связи была успешной
    		PSW[offset_PSW_log]++;
    		return TRUE;
    	} else
    		return FALSE;
    }
    Последний раз редактировалось SokolovS; 03.11.2014 в 11:40.

  3. #553
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Скрипт не проверяет ситуацию ошибок второго типа, например если мастер пытается записать регистр в слейв по несуществующему адресу регистра, то в ответ будет послан пакет из 5 байт, а не из 8.
    //[0]-адрес устройства
    //[1]-Код функции ModbusRTU с индикацией ошибки-запись нескольких регистров 0x90
    //[2]-код ошибки (0x02)
    //[3]-ст.байт CRC
    //[4]-мл.байт CRC
    см пост#620

    ЗЫ. Стандартые процедуры обмена при ошибках записывают в регистре PSW61(PSW71) число не успешных попыток обмена без учета повторных попыток, а в PSW62(PSW72) и PSW64(PSW73) с учетом повторных попыток, т.е. если число повторов задано 3, то при тайм-ауте PSW61(PSW71)=N, а PSW62(PSW72)=3хN, где N-число команд записи
    Последний раз редактировалось petera; 28.10.2014 в 16:01.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #554

    По умолчанию

    А теперь?
    Код:
    		bRecieve[1] != bSend[1] || //Правильной функцией
    По задумке эта строка проверяет чего там вернуло устройство, и в случае возвращённой ошибки там будет не 0х10, а 0х90. Скрипт ещё несколько раз помучает устройство и отстанет, записав всё в ошибки. По задумке.

  5. #555
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Если нам не важна причина ошибок, тот же неверный адрес регистра, для дальнейшего принятия решений, то тогда можно ограничится и просто констатацией ошибки.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #556

    По умолчанию

    Я не вижу других вариантов
    Штатные функции не поддерживают такого и смысла расширять возможности нет

  7. #557
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Самое интересное, что похоже без наших усилий в регистры PSW62(PSW72) панель и так сама пишет даже для команд Send() и Receive()
    Регистры
    PSW63(PSW73) проверяю.

    ЗЫ
    PSW60(PSW70) (Успешные попытки) автоматически не обновляются
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  8. #558
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    В общем тайм-аут Receive() вызывает автоматическое увеличение PSW62(PSW72) на 1
    PSW60(PSW71), PSW61(PSW71), PSW63(PSW73) автоматически не увеличиваются.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  9. #559

    По умолчанию

    Правда? Хм... Ну убрал тогда таймауты

  10. #560

    По умолчанию

    Помогите с проблемой: создаю проект (панель мастер, частотник слэцв) в проекте создаю две кнопки управления (пуск и стоп чп), в настройках этими кнопками указываю Регистр: 0х, адрес регистра пуска 0 для стоп 1. загружаю проект в панель, перезагружаю ее, все работает: нажимаю на пуск на частотнике загорается кнопка пуск - частотник стартует, нажимаю стоп - на частотник приходит команда стоп, частотник останавливается. все ок. на этом этапе нет проблем.
    в проекте создаю "цифровой дисплей" регистр 4х (инпутЪ), адрес 1 (должен отображать частоту на выходе частотника), также добавляю цифровой ввод регистр 3х (холдинг) (типо задание Hz).
    гружу в панель. перезагружаю ее и тут возникают проблемы, вылазиет окно в котором сообщается: потеря связи с плк.
    ожидание в настройках панели выставил 250мс. когда были только кнопки проблем небыло со связью.

Страница 56 из 94 ПерваяПервая ... 646545556575866 ... ПоследняяПоследняя

Похожие темы

  1. Панели оператора СП3xx. Вопросы и ответы
    от Мурат Ахриев в разделе Панели оператора (HMI)
    Ответов: 3197
    Последнее сообщение: 23.04.2024, 13:45
  2. Индикатор ИП120 , вопросы- ответы
    от rovki в разделе Программируемые реле
    Ответов: 56
    Последнее сообщение: 03.11.2017, 15:58
  3. СПК 110 в качестве Панели оператора
    от GSM73 в разделе СПК1хх
    Ответов: 3
    Последнее сообщение: 14.03.2017, 00:42
  4. СПК 107 в качестве панели оператора
    от Леонид в разделе СПК1хх
    Ответов: 15
    Последнее сообщение: 20.11.2015, 08:17
  5. Ответов: 4
    Последнее сообщение: 27.10.2012, 23:12

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •