Показано с 1 по 10 из 931

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

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    По умолчанию

    Насколько я понимаю, соответствие 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.

Похожие темы

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

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

Ваши права

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