| 1 | short CCP4002Prot::Transmit(unsigned int cpStatus)
|
|---|
| 2 | {
|
|---|
| 3 | short transRet = 0; // Rückgabewert von Trans()
|
|---|
| 4 | short recvRet = 0; // Rückgabewert von Recv()
|
|---|
| 5 |
|
|---|
| 6 | m_cpStatus = cpStatus;
|
|---|
| 7 | switch (m_cpStatus)
|
|---|
| 8 | {
|
|---|
| 9 | case CP_A_SEND: m_transChar = 'A'; m_bytesSollRecv = 0; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // Reset CP4002
|
|---|
| 10 | case CP_J_SEND: m_transChar = 'J'; m_bytesSollRecv = 16; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // GC-Ident anfordern
|
|---|
| 11 | case CP_N_SEND: m_transChar = 'N'; m_bytesSollRecv = 0; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // FlushMode prüfen?
|
|---|
| 12 | case CP_C_SEND: m_transChar = 'C'; m_bytesSollRecv = 14; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // SBlockA
|
|---|
| 13 | case CP_H_SEND: m_transChar = 'H'; m_bytesSollRecv = 14; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // SBlockB
|
|---|
| 14 | case CP_SMB_SEND: m_transChar = '\0'; m_bytesSollRecv = 0; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // a-m Parameter
|
|---|
| 15 | case CP_D_SEND: m_transChar = 'D'; m_bytesSollRecv = 29; m_recvTimeoutSec = CP_NORMAL_TIMEOUT; break; // Methode
|
|---|
| 16 | case CP_START: m_transChar = 'B'; m_bytesSollRecv = 42000; m_recvTimeoutSec = ((SMethodBlock.sample_time*1000) + 5000); break; // Analysendaten
|
|---|
| 17 | default: ASSERT(false); break; // Sollte nie vorkommen!
|
|---|
| 18 | }
|
|---|
| 19 |
|
|---|
| 20 | memset(m_transBuf, 0x00, CP_TRANSMIT_MAX_LEN);
|
|---|
| 21 |
|
|---|
| 22 | m_myTimer->Set_MaxSecs(m_recvTimeoutSec/1000);
|
|---|
| 23 |
|
|---|
| 24 | switch (m_cpStatus)
|
|---|
| 25 | {
|
|---|
| 26 | case CP_A_SEND:
|
|---|
| 27 | case CP_J_SEND:
|
|---|
| 28 | case CP_N_SEND:
|
|---|
| 29 | case CP_C_SEND:
|
|---|
| 30 | case CP_H_SEND:
|
|---|
| 31 | case CP_D_SEND:
|
|---|
| 32 | case CP_START:
|
|---|
| 33 | // Befehlszeichen senden
|
|---|
| 34 | m_transBuf[0] = m_transChar;
|
|---|
| 35 | m_transBuflen = 1;
|
|---|
| 36 |
|
|---|
| 37 | transRet = Trans();
|
|---|
| 38 | if (0 == transRet) // Wenn das Senden erfolgreich war, wird empfangen
|
|---|
| 39 | recvRet = Recv();
|
|---|
| 40 | break;
|
|---|
| 41 |
|
|---|
| 42 | case CP_SMB_SEND:
|
|---|
| 43 | // Parameter a-m senden
|
|---|
| 44 | m_pSMethodBlock = (char *)&SMethodBlock;
|
|---|
| 45 | m_transBuflen = 2;
|
|---|
| 46 |
|
|---|
| 47 | for (int cSmb = 'a'; cSmb <= 'm'; cSmb++)
|
|---|
| 48 | {
|
|---|
| 49 | if (cSmb == 's') /* 19tes Element aus SMB überspringen*/
|
|---|
| 50 | cSmb++;
|
|---|
| 51 |
|
|---|
| 52 | m_transBuf[0] = cSmb;
|
|---|
| 53 | m_transBuf[1] = *m_pSMethodBlock++;
|
|---|
| 54 |
|
|---|
| 55 | transRet = Trans();
|
|---|
| 56 | if (0 == transRet) // Wenn das Senden erfolgreich war, wird empfangen
|
|---|
| 57 | recvRet = Recv();
|
|---|
| 58 | }
|
|---|
| 59 | break;
|
|---|
| 60 |
|
|---|
| 61 | default: // Sollte nie vorkommen!
|
|---|
| 62 | ASSERT(false);
|
|---|
| 63 | break;
|
|---|
| 64 | }
|
|---|
| 65 |
|
|---|
| 66 | return (transRet | recvRet);
|
|---|
| 67 | }
|
|---|
| 68 |
|
|---|
| 69 | short CCP4002Prot::Trans(void)
|
|---|
| 70 | {
|
|---|
| 71 | short ret = 0;
|
|---|
| 72 | DWORD retErr = 0;
|
|---|
| 73 |
|
|---|
| 74 | SetCpStatusString(TRANSMIT);
|
|---|
| 75 |
|
|---|
| 76 | if (false == WriteCanQueue(m_comnum, m_transBuf, m_transBuflen))
|
|---|
| 77 | {
|
|---|
| 78 | DTLOG(m_logid, DT_CP4002PROT_CAN_WRITE_FAILED);
|
|---|
| 79 | retErr = GetLastError();
|
|---|
| 80 | m_errCounterTrans++;
|
|---|
| 81 | ret = -1;
|
|---|
| 82 | }
|
|---|
| 83 | else
|
|---|
| 84 | {
|
|---|
| 85 | m_myTimer->Set_MaxSecs(m_recvTimeoutSec/1000);
|
|---|
| 86 | m_myTimer->StartTimer(true);
|
|---|
| 87 | retErr = 0;
|
|---|
| 88 | m_errCounterTrans = 0;
|
|---|
| 89 | ret = 0;
|
|---|
| 90 | }
|
|---|
| 91 |
|
|---|
| 92 | return ret;
|
|---|
| 93 | }
|
|---|
| 94 |
|
|---|
| 95 | short CCP4002Prot::Recv(void)
|
|---|
| 96 | { // Wartet auf ReceiveEvents und überwacht Timeouts
|
|---|
| 97 | static int merkeBytesReceivedAll = 0;
|
|---|
| 98 | DWORD waitResult = 0;
|
|---|
| 99 | short ret = 0;
|
|---|
| 100 | bool timeout = false;
|
|---|
| 101 |
|
|---|
| 102 | SetCpStatusString(RECEIVE);
|
|---|
| 103 |
|
|---|
| 104 | m_bytesReceived = 0;
|
|---|
| 105 | m_recvTimeout = false;
|
|---|
| 106 |
|
|---|
| 107 | memset(m_recvBuf, 0x00, CP_RECEIVE_MAX_LEN);
|
|---|
| 108 |
|
|---|
| 109 | if (m_bytesSollRecv > 0)
|
|---|
| 110 | { // Wenn gesendeter Befehl eine Antwort erwartet, wird auf ReceiveEvent gewartet
|
|---|
| 111 | if (CP_START == m_cpStatus)
|
|---|
| 112 | {
|
|---|
| 113 | m_CountSampleTime = true;
|
|---|
| 114 | m_startSampleTime = time(NULL);
|
|---|
| 115 | }
|
|---|
| 116 |
|
|---|
| 117 | //merkeBytesReceivedAll = 0;
|
|---|
| 118 | while ((m_bytesReceived < m_bytesSollRecv) && (!timeout) && m_ProtocollIsRunning)
|
|---|
| 119 | { // Wenn noch nicht alle Bytes empfangen wurden und es noch kein Timeout gab, wird auf weitere Daten gewartet
|
|---|
| 120 | // Prüfung von 'm_ProtocollIsRunning' ermöglicht sofortiges Beenden während Datenempfang von Messwerk
|
|---|
| 121 | if (merkeBytesReceivedAll != m_bytesReceivedAll)
|
|---|
| 122 | { // Es wurden neuen Daten empfangen
|
|---|
| 123 | m_myTimer->Set_MaxSecs(CP_ANADATA_TIMEOUT_2/1000);
|
|---|
| 124 | m_myTimer->ResetTimer(); // Timer zurücksetzen
|
|---|
| 125 |
|
|---|
| 126 | if (CP_START == m_cpStatus && false == m_CountRunTime)
|
|---|
| 127 | { // Nach dem Spülen, wenn das erste Byte empfangen wurde, wird die RunTime gezählt und die Ventile geschaltet
|
|---|
| 128 | m_CountRunTime = true;
|
|---|
| 129 | m_startRunTime = time(NULL);
|
|---|
| 130 |
|
|---|
| 131 | m_flushingFinished = true;
|
|---|
| 132 | }
|
|---|
| 133 |
|
|---|
| 134 | merkeBytesReceivedAll = m_bytesReceivedAll;
|
|---|
| 135 | }
|
|---|
| 136 |
|
|---|
| 137 | if (m_myTimer->Get_NumberOfExpiry() > 0)
|
|---|
| 138 | { // Wenn Timer abgelaufen war -> Timeout!
|
|---|
| 139 | m_myTimer->ResetTimer(); // Timer zurücksetzen
|
|---|
| 140 | timeout = true;
|
|---|
| 141 | ret = -1;
|
|---|
| 142 | }
|
|---|
| 143 | }
|
|---|
| 144 | merkeBytesReceivedAll = m_bytesReceivedAll; // Zur Sicherheit am Ende nochmals kopieren
|
|---|
| 145 |
|
|---|
| 146 | m_myTimer->StopTimer();
|
|---|
| 147 |
|
|---|
| 148 | if (m_bytesReceived == m_bytesSollRecv && (!timeout))
|
|---|
| 149 | { // Wenn alles empfangen und kein Timeout
|
|---|
| 150 | ret = ProcessRecvData();
|
|---|
| 151 | xValue(CP4002ReqWithAnsw)++;
|
|---|
| 152 | //SaveXVars();
|
|---|
| 153 | }
|
|---|
| 154 | else
|
|---|
| 155 | {
|
|---|
| 156 | DTLOG(m_logid, DT_CP4002PROT_RECEIVE_FAILED, m_bytesSollRecv, m_bytesReceived);
|
|---|
| 157 | TRACE(_T("NOT all Bytes received or timeout! %i\n"), m_bytesReceived);
|
|---|
| 158 | xValue(CP4002ReqWithoutAnsw)++;
|
|---|
| 159 | //SaveXVars();
|
|---|
| 160 | }
|
|---|
| 161 | }
|
|---|
| 162 |
|
|---|
| 163 | if (CP_START == m_cpStatus)
|
|---|
| 164 | {
|
|---|
| 165 | m_CountSampleTime = false;
|
|---|
| 166 | m_CountRunTime = false;
|
|---|
| 167 | }
|
|---|
| 168 |
|
|---|
| 169 | return ret;
|
|---|
| 170 | }
|
|---|
| 171 |
|
|---|
| 172 | bool CCP4002Prot::RecvFomCAN(CANMSG *cm)
|
|---|
| 173 | { // Hier kommt Empfangenes von CAN an
|
|---|
| 174 | CANMSG *cmTemp = cm;
|
|---|
| 175 | memcpy((m_recvBuf+m_bytesReceived), cmTemp->byContent, cmTemp->byDatalength);
|
|---|
| 176 |
|
|---|
| 177 | if (0 == m_bytesReceived)
|
|---|
| 178 | m_bytesReceivedAll = 0;
|
|---|
| 179 | m_bytesReceivedAll += cmTemp->byDatalength;
|
|---|
| 180 |
|
|---|
| 181 | if (CP_START == m_cpStatus)
|
|---|
| 182 | SetCpStatusString(RECEIVE);
|
|---|
| 183 |
|
|---|
| 184 | m_bytesReceived += cmTemp->byDatalength;
|
|---|
| 185 |
|
|---|
| 186 | return true;
|
|---|
| 187 | }
|
|---|