- Katılım
- 13 Ocak 2007
- Mesajlar
- 2,284
- Puanları
- 1,866
- Yaş
- 47
Alıntıdır:Katkılarından dolayı james_sr üyemize teşekkür ederiz.
Ethernet üzerinden gelen karışık karakter bilgisini (8 karakter 8 byte) gerçek sayı olarak okunmasını sağlayan FB yi ekledim. KG bilgisi ethernet üzerinden karakter olarak gelmekteydi ve karakterlerin sırası her bağlantı koptuğunda değişkenlik gösteriyordu ve programda gerçek sayıya ihtiyacım vardı. bu program bu ihtiyaç yüzünden doğdu.
Ethernet üzerinden gelen karışık karakter bilgisini (8 karakter 8 byte) gerçek sayı olarak okunmasını sağlayan FB yi ekledim. KG bilgisi ethernet üzerinden karakter olarak gelmekteydi ve karakterlerin sırası her bağlantı koptuğunda değişkenlik gösteriyordu ve programda gerçek sayıya ihtiyacım vardı. bu program bu ihtiyaç yüzünden doğdu.
Kod:
FUNCTION_BLOCK FB207
TITLE = 'BYTE_TO_REAL_FB'
//
// Gelen "Byte" tipindeki karakterleri "real" dönüştür
//Created by xx 2010
VERSION: '1.0'
AUTHOR:'xx'
NAME:'BB_to_RE'
FAMILY:'BB_to_RE'
VAR_INPUT
db_byte_1 :BYTE; //nport'tan gelen veri -ethrnet
db_byte_2 :BYTE;
db_byte_3 :BYTE;
db_byte_4 :BYTE;
db_byte_5 :BYTE;
db_byte_6 :BYTE;
db_byte_7 :BYTE;
db_byte_8 :BYTE;
END_VAR
VAR_OUTPUT
db_real_out :REAL:=0.0;
value_ok: BOOL:=false;
END_VAR
VAR_TEMP
// Temporary Variables
END_VAR
VAR
db_word: ARRAY[1..8] OF WORD:=0;
db_int: ARRAY[1..8] OF INT:=0;
db_dint: ARRAY[1..8] OF DINT:=0;
shift_real: ARRAY[1..9] OF REAL:=0.0;
// buffer byte kaydırmayı gerçekleştirir.
adim :INT;
i :INT;
END_VAR
BEGIN
value_ok :=false;
db_real_out := 0.0;
db_word[1] := BYTE_TO_WORD (db_byte_1) ;
db_word[2] := BYTE_TO_WORD (db_byte_2) ;
db_word[3] := BYTE_TO_WORD (db_byte_3) ;
db_word[4] := BYTE_TO_WORD (db_byte_4) ;
db_word[5] := BYTE_TO_WORD (db_byte_5) ;
db_word[6] := BYTE_TO_WORD (db_byte_6) ;
db_word[7] := BYTE_TO_WORD (db_byte_7) ;
db_word[8] := BYTE_TO_WORD (db_byte_8) ;
FOR i:=1 TO 8 BY 1 DO
db_int[i] := WORD_TO_INT (db_word [i]) ;
IF db_int[i] = 32 THEN
db_int[i]:=0 ;
ELSIF db_int[i] >=176 THEN
db_int[i]:= ( db_int[i]- 176);
ELSIF db_int[i] >=48 AND db_int[i] <=57 THEN
db_int[i]:= ( db_int[i]- 48);
END_IF;
END_FOR;
FOR i:=1 TO 8 BY 1 DO
db_dint[i] := INT_TO_DINT (db_int [i]) ;
shift_real[i] := DINT_TO_REAL (db_dint [i]) ;
END_FOR;
FOR adim:=0 TO 8 BY 1 DO
IF shift_real[1] = 45.0 OR shift_real[1] = 43.0 THEN
db_real_out:=0.0;
db_real_out:=(shift_real[2]*100000.0)+(shift_real[3]*10000.0)+(shift_real[4]*1000.0)+(shift_real[5]*100.0)+(shift_real[6]*10.0)+(shift_real[7]*1.0);
IF shift_real[1] = 45.0 THEN
db_real_out := (-1.0)*(db_real_out);
END_IF; // hesaplama işlemi yap çık
value_ok:=true;
db_real_out := (db_real_out/1000.0);
EXIT;
ELSE
// kaydırma işlemi
shift_real[9] := shift_real[1] ; // ilk byte buffera at
shift_real[1] := shift_real[2] ; // B2 -> B1 e taşır
shift_real[2] := shift_real[3] ; // B3 -> B2 e taşır
shift_real[3] := shift_real[4] ; // B4 -> B3 e taşır
shift_real[4] := shift_real[5] ; // B5 -> B4 e taşır
shift_real[5] := shift_real[6] ; // B6 -> B5 e taşır
shift_real[6] := shift_real[7] ; // B7 -> B6 e taşır
shift_real[7] := shift_real[8] ; // B8 -> B7 e taşır
shift_real[8] := shift_real[9] ; // B1 -> B8 e taşır
END_IF;
END_FOR;
Son düzenleme: