恭喜,你发布的帖子
发布于 2017-08-04 08:27:57
2楼
上面的程序图片看起来比较麻烦。我转换了文本。
FUNCTION "FECU_TYP_J" : VOID
TITLE =
//Istwerterfassung FeCu Typ J
// maximale Messtellen = 16
//
//
//Datenschnittstelle: FL_Takt = Flanke Zeitnormal (100 ms)
// Mess_Zyklus = Messung alle N Sekunden
// PEW_Start = Adresse der AD-Baugruppe
// Istwert_DB = Datenbaustein Istwerte
// Istw_DW_Start = Start DW Istwerte
// Anzahl = Anzahl der Messungen
// Offset_DB = Datenbaustein Offsetwerte
// Offset_DW_Start = Start DW Offsetwerte
// Fehler_DB = Datenbaustein Fühlerbruch
// Fehler_DB_Start = Start DB Fühlerbruch
// Fehler_Bit_Start = Start Bit Fühlerbruch
//
{ S7_language := '7(1) Deutsch (Deutschland) 28.01.2016 09:38:44' }
AUTHOR : WDS
NAME : FeCu
VERSION : 0.1
VAR_INPUT
FL_100mS : BOOL ; //Flanke Zeitnormal
Mess_Zyklus : INT ; //Messung alle N Sekunden
PEW_Start : INT ; //Adresse Peripheriewort
Istwert_DB : BLOCK_DB ; //Datenbaustein Istwerte
Istw_DW_Start : INT ; //Start DW Istwerte
Anzahl : INT ; //Anzahl der Messungen
Offset_DB : BLOCK_DB ; //Datenbaustein Offsetwerte
Offset_DW_Start : INT ; //Start DW Offsetwerte
Komp_Temp : INT ; //Temperatur der Vergleichsstelle
Fehler_DB : BLOCK_DB ; //Datenbaustein Fühlerbruch
Fehler_Byte_Start : INT ; //Start Byte Fühlerbruch
Fehler_Bit_Start : INT ; //Start Bit Fühlerbruch
Freigabe_Pruef : BOOL ; //Freigabe Fühlerbruchprüfung
END_VAR
VAR_IN_OUT
C_MessZyklus : INT ; //Counter für Messzyklus
END_VAR
VAR_TEMP
Anzahl_Messung_2 : INT ; //Anzahl der Messungen * 2
Index : INT ; //Index Z?hler
Bit_Count : INT ; //Bitz?hler für Fühlerbruch
Byte_Count : INT ; //Bytez?hler für Fühlerbruch
AD_Wert : INT ; //AD Wert
Pointer_Byte : INT ; //Pointer Byte Offset
Pointer_Bit : INT ; //Pointer Bit Offset
END_VAR
BEGIN
NETWORK
TITLE =control intervall
A #FL_100mS;
JNB Ende;
// Z?hle Sekunden Takt
//--------------------------
L #C_MessZyklus;
L 1;
+I ;
T #C_MessZyklus;
// Prüfe ob Zeit für neue Messung abgelaufen
//--------------------------------------------
L #Mess_Zyklus;
>=I ;
JNB Ende;
// neue Messung
//----------------------------
L 0;
T #C_MessZyklus;
NETWORK
TITLE =Init. FC
L #Anzahl; //Lese Anzahl der Messungen
SLW 1; //und multipliziere mit 2
T #Anzahl_Messung_2;
L 0;
T #Index; //Index Counter = 0
L #Fehler_Bit_Start; //Start Byte Fühlerbruch
T #Pointer_Bit;
L #Fehler_Byte_Start; //Start Byte Fühlerbruch
// T #Pointer_Byte //test
// Wenn Messtellen > 8 dann erh?he Byte Adresse +1
// Wegen LSB MSB
//-------------------------------------------------
// L 8 //test
// >I //test
// SPBNB Loop //test
// Increment Start Byte
//--------------------------------------------------
// TAK //test
L 1;
+I ;
T #Pointer_Byte;
NETWORK
TITLE =calculate pointers
Loop: L #PEW_Start; //Pointer auf den Anfang des Peripheriewort
L #Index; //Lade Index Counter
+I ; //Berechne Adr. des Peripheriewortes
ITD ; //Integer -> double Integer
SLD 3; //Konvertierung in's Pointerformat
L P#P 0.0; //Int. Pointer
+D ; //Bilde Pointeradr. Peripheriewort
LAR1 ; //Lade Pointer in Adressregister 1
NETWORK
TITLE =calculate analogue value
L W [AR1,P#0.0]; //Lese Analogwert
ITD ;
DTR ; //A-D-Wert in Real
L 1.000000e+000; //Umrechnungsfaktor (1200,0 °C -> 12000 Einheiten)
*R ; //Multipliziere
RND ; //A-D Wert in Integer
T #AD_Wert; //sichere AD-Wert
NETWORK
TITLE =offset kompensation
OPN #Offset_DB; //Offset DB ?ffnen
L #Index; //Lade Index Counter
L #Offset_DW_Start; //Lade Offset Start Adresse
+I ;
SLD 3; //Konvertierung in's Pointerformat
LAR1 ; //Lade Pointer in Adressregister
L DBW [AR1,P#0.0]; //Lese Offset Kanal (N)
L #AD_Wert; //Hole AD-Wert Kanal (N)
+I ;
L #Komp_Temp; //Temp. Vergleichsstelle
+I ;
T #AD_Wert; //sichere AD-Wert
NETWORK
TITLE =write analogue value
OPN #Istwert_DB; //Istwert DB ?ffnen
L #Index; //Lade Index Counter
L #Istw_DW_Start; //Lade Iswert Start Adresse
+I ;
SLD 3; //Konvertierung in's Pointerformat
LAR1 ; //Lade Pointer in Adressregister
L #AD_Wert; //Hole AD-Wert Kanal (N)
T DBW [AR1,P#0.0]; //schreibe AD-Wert -> Istwert DB,Kanal (N)
NETWORK
TITLE =calculate bit sensor broken
L #Pointer_Byte; //Start Byte Fühlerbruch
ITD ; //Integer -> double Integer
SLD 3; //Konvertierung in's Pointerformat
L #Pointer_Bit; //Start Bit Fühlerbruch
ITD ; //Integer -> double Integer
OD ; //Addiere Bit Nr
LAR1 ; //Lade Pointer in Adressregister
NETWORK
TITLE =check if broken sensor
OPN #Fehler_DB;
A #Freigabe_Pruef;
JC Chk; //Bei Freigabe Prüfung
A DBX [AR1,P#0.0];
R DBX [AR1,P#0.0]; //Reset Fühlerbruch Bit (N)
JU Inc;
Chk: L #AD_Wert; //Hole AD-Wert Kanal (N)
L 30000;
>I ;
= DBX [AR1,P#0.0]; //Setze Fühlerbruch Bit (N)
NETWORK
TITLE =
// Erhoehe Bit Adresse um 1
//-----------------------------
Inc: L #Pointer_Bit; //Start Bit Fühlerbruch
L 1;
+I ;
T #Pointer_Bit;
// Prüfe ob Bit Adresse > 7
//------------------------------
L 7;
>I ;
JCN NW10;
// Setze MSB Byte
//-------------------------------
L 0;
T #Pointer_Bit;
L #Pointer_Byte;
L 1;
-I ;
T #Pointer_Byte;
NETWORK
TITLE =counter control
// Incrementiere Index Counter
//---------------------------------
NW10: L #Index;
L 2;
+I ;
T #Index;
// Prüfe auf Schleifen Ende
//----------------------------------
L #Anzahl_Messung_2; //Wenn Index > Anzahl der Messungen
>=I ; //dann Ende, sonst weiter
JCN Loop;
NETWORK
TITLE =programm end
Ende: NOP 0;
END_FUNCTION
黄色部分是有疑问的,这句是怎么处理PIW的?
还是第一次看德国人编写的逻辑程序。
确实,其功能很强大啊。
从逻辑程序可以看出,若要修改模拟量的标定值,无需修改程序,修改数据即可!
我怀疑德文版的间接寻址L W[AR1, P#0.0] 就相当于英文版的 L IW[AR1, P#0.0]。
不能确认,仅供参考!
请填写推广理由:
分享
只看
楼主