Спасибо всем кто помог!
Код | char Buf_Otvet[25];
float IRT_Data; int IRT_N; int Zaptos_IRT;
Buf_Otvet[] = {33,49,49,59,53,55,46,53,56,56,59,50,51,52,55,13, ………}; где 33 – начало посылки ответа, при подсчете контрольной суммы не учитывается, 13 – конец посылки, 59- разделительные байты, 49,49 -> № прибора от1 до 254 ( 1-3 байта) 53,55,46,53,56,56 -> 57.588 (физическая величина технологического процесса) от 4 до 7 байт бывает, 50,51,52,55 –контрольная сумма ( 4 - 5 байт)
char *tr = "00000"; char *Data_IRT = "1234567890abcdef"; int b59_1, b59_2;
IRT_Data = 77.77; // может и не надо
Подсчитываю длину посылки, сколько байт занимает № ИРТ (b59_1) и физич. величина(b59_2), далее преобразую и вывожу на экран и в файл для архивации:
if(b59_1 < 3) { // ИРТ № 1-99 tr[0] = Buf_Otvet[1] ; tr[1] = Buf_Otvet[2] ; if(b59_1 == 2) tr[2] = Buf_Otvet[3] ; // может и не надо IRT_N = atoi(tr); } else { // ИРТ № 100-254 tr[0] = Buf_Otvet[1] ; tr[1] = Buf_Otvet[2] ; tr[2] = Buf_Otvet[3] ; tr[3] = Buf_Otvet[4] ; [U]IRT_N = atoi(tr); [/U] } if(b59_2 > 3) { // пришли данные Data_IRT[0] = Buf_Otvet[i+b59_1+1] ; Data_IRT[1] = Buf_Otvet[i+b59_1+2] ; Data_IRT[2] = Buf_Otvet[i+b59_1+3] ; Data_IRT[3] = Buf_Otvet[i+b59_1+4] ; Data_IRT[4] = Buf_Otvet[i+b59_1+5] ; Data_IRT[5] = Buf_Otvet[i+b59_1+6] ; Data_IRT[6] = Buf_Otvet[i+b59_1+7] ; Data_IRT[7] = Buf_Otvet[i+b59_1+8] ; Data_IRT[8] = Buf_Otvet[i+b59_1+9] ;
IRT_Data = atof(Data_IRT); StatusBar1 -> Panels -> Items[3] -> Text = "ИРТ №" + IntToStr(IRT_N);
Label1 -> Caption = FloatToStrF(IRT_Data, ffFixed, 8, 3); //-- для примера …………………………………. }
Отправка данных в ИРТ т.е. запрос на передачу данных
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
Byte Read_IRT1[] = {58, 00, 59, 49, 59, 48, 59, 00, 00, 00, 00, 00, 13}; // ИРТ № < 10 Byte Read_IRT11[] = {58, 00, 00, 59, 49, 59, 48, 59, 00, 00, 00, 00, 00, 13}; // ИРТ № 10-99 // Byte Read_IRT111[] = {58, 00, 00, 00, 59, 49, 59, 48, 59, 00, 00, 00, 00, 00, 13}; // 00- переменные байты char KS_string[9] ;
Timer1 -> Interval = 500; Zaptos_IRT ++;
if(Zaptos_IRT > 32) Zaptos_IRT = 1; //. в сети может быть подключено до // 32 приборов по RS-485 протоколу
if(Zaptos_IRT < 10) {
itoa(Zaptos_IRT, KS_string, 10);
Read_IRT1[1] = KS_string[0]; KS = 0; KS = GetCtrSum(Read_IRT1, 6); // подсчитать КС
itoa(KS, KS_string, 10); Read_IRT1[7]= KS_string[0]; Read_IRT1[8]= KS_string[1]; Read_IRT1[9]= KS_string[2]; Read_IRT1[10]= KS_string[3]; Read_IRT1[11]= KS_string[4]; MessageForIRT((LPCVOID)Read_IRT1, sizeof(Read_IRT1), Sender); ……………………… // прием и сортировка } if(Zaptos_IRT > 9) {
itoa(Zaptos_IRT, KS_string, 10);
Read_IRT11[1] = KS_string[0]; Read_IRT11[2] = KS_string[1];
KS = 0; KS = GetCtrSum(Read_IRT11, 7); // подсчитать КС
itoa(KS, KS_string, 10);
Read_IRT11[8]= KS_string[0]; Read_IRT11[9]= KS_string[1]; Read_IRT11[10]= KS_string[2]; Read_IRT11[11]= KS_string[3]; Read_IRT11[12]= KS_string[4]; MessageForIRT((LPCVOID)Read_IRT11, sizeof(Read_IRT11), Sender); ……………………… // прием и сортировка
} ………………………………..
// Не стал корячиться с одним массивом, работает и ладно.
}
|
|