FUNCTION "SEW_SBP" : VOID
TITLE =SEW-Servo: Buspositonierung
AUTHOR : HO
FAMILY : SEW
NAME : BUS_POSI
VERSION : 0.1
VAR_INPUT
Daten_Zeiger : ANY ; //Zeiger Ablage Daten für die Achse
END_VAR
VAR_TEMP
PI : STRUCT //Prozeßeingangsdaten
Status : BYTE ; //PE: Status Umrichter
Motor_turning : BOOL ; //PE: Motor läuft
Inverter_ready : BOOL ; //PE: Umrichter bereit
referenced : BOOL ; //PE: Achse Referenziert
Target_position_reached : BOOL ; //PE: Ziel Position erreicht
Brake_released : BOOL ; //PE: Bremse gelöst
Error : BOOL ; //PE: Fehler
Limit_Switch_CW : BOOL ; //PE: Endschalter Rechts
Limit_switch_CCW : BOOL ; //PE: Endschalter Links
Actual_position : DINT ; //PE: Aktuelle Position
Actual_speed : INT ; //PE: Aktuelle Geschwindigkeit
Active_current : INT ; //PE: Aktueller Motor-Strom
Device_utilisation : INT ; //PE: Aktuelle Geräteauslastung
END_STRUCT ;
PO : STRUCT //Prozeßausgangsdaten
start : BOOL ; //PA: Start
Jog_plus : BOOL ; //PA: Tippen +
Jog_minus : BOOL ; //PA: Tippen -
mode_low : BOOL ; //PA: Mode Bit Low
mode_high : BOOL ; //PA: Mode Bit High
CTW_Bit_13 : BOOL ; //PA: Bit 13
CTW_Bit_14 : BOOL ; //PA: Bit 14
SWES : BOOL ; //PA: /Softwareendschalter
Contr_inhibit : BOOL ; //PA: Reglersperre - /Freigabe
Rapid_stop : BOOL ; //PA: Freigabe - /Schnellstop
Stop : BOOL ; //PA: Freigabe - /Halt
hold : BOOL ; //PA: /Halteregelung
Ramp : BOOL ; //PA: Rampen
Para : BOOL ; //PA: Parameter
Reset_fault : BOOL ; //PA: Reset
CTW_Bit_7 : BOOL ; //PA: Bit 7
Setpoint_position : DINT ; //PA: Soll Position
Setpoint_speed : INT ; //PA: Soll Geschwindigkeit
Start_ramp : INT ; //PA: Hochlauf Rampe
Stop_ramp : INT ; //PA: Tieflauf Rampe
END_STRUCT ;
Daten : STRUCT //Zeiger für DB und Adresse der Anzeige
DB_Nr : INT ; //Anzeige-DB Nr
Adresse : DWORD ; //Anzeige Start-Adresse im DB
END_STRUCT ;
Ref : BOOL ; //Referenz
Pos : BOOL ; //Positonierung angewählt
Peripherie : WORD ; //Peripherie-Zeiger Umrichter
RET_VAL_SFC14 : INT ; //Rückgabe vom DP lesen
RET_VAL_SFC15 : INT ; //Rückgabe zum DP schreiben
Merker : BOOL ; //Temponärer Merker
END_VAR
BEGIN
NETWORK
TITLE =Daten-Zeiger umladen
//ANY-Zeiger umladen
L P##Daten_Zeiger;
LAR1 ;
//DB-Nr Temp. zwischenspeichern
L W [AR1,P#4.0];
T #Daten.DB_Nr;
//Adresse Temp. zwischenspeichern
L D [AR1,P#6.0];
T #Daten.Adresse;
NETWORK
TITLE =Datenbaustein aufschlagen und Adressregister stellen
AUF DB [#Daten.DB_Nr];
LAR1 #Daten.Adresse;
NETWORK
TITLE =Daten aus den Umrichter lesen
//Zeiger Peripherie stellen
L DBW [AR1,P#0.0]; //SEW_SBP_Daten.DRIVE_IO_ADDRESS
T #Peripherie;
//Eingangsdaten vom FU lesen
CALL "DPRD_DAT" (
LADDR := #Peripherie,
RET_VAL := #RET_VAL_SFC14,
RECORD := #PI);
//Adressregister wieder herstellen
LAR1 #Daten.Adresse;
//Fehlerauswertung "vom FU-lesen"
L #RET_VAL_SFC14;
L 0;
<>I ;
SPB ERR;
NETWORK
TITLE =Prozeßeingangsdaten aufbereiten und Rangieren
//Aktuelle Position
L #PI.Actual_position;
T DBD [AR1,P#18.0]; //SEW_SBP_Daten.ACTUAL_POSITION
//Aktuelle Geschwindigkeit
L #PI.Actual_speed;
T DBW [AR1,P#22.0]; //SEW_SBP_Daten.ACTUAL_SPEED
//Aktueller Strom
L #PI.Active_current;
T DBW [AR1,P#24.0]; //SEW_SBP_Daten.ACTUAL_CURRENT
//Aktuelle Geräteauslastung
L #PI.Device_utilisation;
T DBW [AR1,P#26.0]; //SEW_SBP_Daten.DEVICE_UTILISTION
//FU-Bereit
U #PI.Inverter_ready;
= DBX [AR1,P#14.3]; //SEW_SBP_Daten.INVERTER_READY
//Zielpostion erreicht
U #PI.Target_position_reached;
= DBX [AR1,P#14.7]; //SEW_SBP_Daten.TARGET_POS_REACHED
//Referenziert
U #PI.referenced;
= DBX [AR1,P#14.6]; //SEW_SBP_Daten.REFERNCED
//Endschalter Rechts
U #PI.Limit_Switch_CW;
= DBX [AR1,P#15.0]; //SEW_SBP_Daten.SWITCH_max
//Endschalter Links
U #PI.Limit_switch_CCW;
= DBX [AR1,P#15.1]; //SEW_SBP_Daten.SWITCH_min
//Warnung
U #PI.Inverter_ready;
U #PI.Error;
= DBX [AR1,P#14.2]; //SEW_SBP_Daten.WARNING_OF_AXIS
//Fehler
UN #PI.Inverter_ready;
U #PI.Error;
= DBX [AR1,P#14.1]; //SEW_SBP_Daten.FAULT_OF_AXIS
//Fehler vorhanden???
U #PI.Error;
SPB EL;
//Kein Fehler "0" laden
L 0;
SPA ENR;
//Fehler vorhanden und Rangieren
EL: L #PI.Status;
ENR: T DBW [AR1,P#16.0]; //SEW_SBP_Daten.FAULT_NO
NETWORK
TITLE =Prozeßausgangsdaten aufbereiten und rangieren
//Freigabe - /Schnellstopp rangieren
U DBX [AR1,P#2.0]; //SEW_SBP_Daten.ENABLE_RAPID_STOP
= #PO.Rapid_stop;
//Tippen plus angewählt
U DBX [AR1,P#2.2]; //SEW_SBP_Daten.JOG_PLUS_MODE
UN DBX [AR1,P#2.3]; //SEW_SBP_Daten.JOG_MINUS_MODE
UN DBX [AR1,P#2.4]; //SEW_SBP_Daten.REF_TRAVEL_MODE
UN DBX [AR1,P#2.5]; //SEW_SBP_Daten.POSITIONING_MODE
= #PO.Jog_plus;
//Tippen minus angewählt
UN DBX [AR1,P#2.2]; //SEW_SBP_Daten.JOG_PLUS_MODE
U DBX [AR1,P#2.3]; //SEW_SBP_Daten.JOG_MINUS_MODE
UN DBX [AR1,P#2.4]; //SEW_SBP_Daten.REF_TRAVEL_MODE
UN DBX [AR1,P#2.5]; //SEW_SBP_Daten.POSITIONING_MODE
= #PO.Jog_minus;
//Referenzieren angewählt
UN DBX [AR1,P#2.2]; //SEW_SBP_Daten.JOG_PLUS_MODE
UN DBX [AR1,P#2.3]; //SEW_SBP_Daten.JOG_MINUS_MODE
U DBX [AR1,P#2.4]; //SEW_SBP_Daten.REF_TRAVEL_MODE
UN DBX [AR1,P#2.5]; //SEW_SBP_Daten.POSITIONING_MODE
= #Ref;
//Positionieren angewählt
UN DBX [AR1,P#2.2]; //SEW_SBP_Daten.JOG_PLUS_MODE
UN DBX [AR1,P#2.3]; //SEW_SBP_Daten.JOG_MINUS_MODE
UN DBX [AR1,P#2.4]; //SEW_SBP_Daten.REF_TRAVEL_MODE
U DBX [AR1,P#2.5]; //SEW_SBP_Daten.POSITIONING_MODE
= #Merker;
U #Merker;
U #PI.referenced;
= #Pos;
U #Merker;
UN #PI.referenced;
= DBX [AR1,P#14.5]; //SEW_SBP_Daten.NOT_REFERENCED
//Software Endschalter freifahren
U #PI.Motor_turning;
SPB SWES;
SET ;
U DBX [AR1,P#2.5]; //SEW_SBP_Daten.SOFT_SWITCH_RELEASE
= #PO.SWES;
SWES: NOP 0;
//Anwahl "mode_low"
O #PO.Jog_plus;
O #PO.Jog_minus;
O #Pos;
= #PO.mode_low;
//Halteregelung
UN #PO.mode_low;
UN #Ref;
= #PO.hold;
//Anwahl "Mode high"
O #Ref;
O #Pos;
= #PO.mode_high;
//Freigabe - /Halt via Feldbus
U #PO.Rapid_stop;
= #PO.Stop;
UN #Merker;
= DBX [AR1,P#14.4]; //SEW_SBP_Daten.AXIS_INTERLOCKED
//Fault_Reset
U DBX [AR1,P#2.1]; //SEW_SBP_Daten.RESET
= #PO.Reset_fault;
//Start Freigabe
U #PI.Brake_released;
= #PO.start;
//Rücksetzen aller nicht verwendeten Steuerwort-Bits
SET ;
R #PO.Contr_inhibit;
R #PO.Ramp;
R #PO.Para;
R #PO.CTW_Bit_13;
R #PO.CTW_Bit_14;
R #PO.SWES;
//Sollwerte übertragen
L DBD [AR1,P#4.0]; //SEW_SBP_Daten.Job.SETPOINT_POS
T #PO.Setpoint_position;
L DBW [AR1,P#8.0]; //SEW_SBP_Daten.SETPOINT_SPEED
T #PO.Setpoint_speed;
L DBW [AR1,P#10.0]; //SEW_SBP_Daten.START_RAMP
T #PO.Start_ramp;
L DBW [AR1,P#12.0]; //SEW_SBP_Daten.STOP_RAMP
T #PO.Stop_ramp;
NETWORK
TITLE =Daten zum Umrichter schreiben
//Ausgangsdaten an FU schreiben
CALL "DPWR_DAT" (
LADDR := #Peripherie,
RECORD := #PO,
RET_VAL := #RET_VAL_SFC15);
//Adressregister wieder herstellen
LAR1 #Daten.Adresse;
//Fehlerauswertung "an FU schreiben"
L #RET_VAL_SFC15;
L 0;
<>I ;
SPB ERR;
SET ;
= DBX [AR1,P#14.0]; //SEW_SBP_Daten.COMMUNICATION_OK
//Baustein Beenden "Kein Fehler"
BEA ;
NETWORK
TITLE =Kommunikationsfehler auswerten
ERR: L 0;
T DBW [AR1,P#16.0]; //SEW_SBP_Daten.FAULT_NO
T DBD [AR1,P#18.0]; //SEW_SBP_Daten.ACTUAL_POSITION
T DBW [AR1,P#22.0]; //SEW_SBP_Daten.ACTUAL_SPEED
T DBW [AR1,P#24.0]; //SEW_SBP_Daten.ACTUAL_CURRENT
T DBW [AR1,P#26.0]; //SEW_SBP_Daten.ACTUAL_DEVICE_UTILISTION
SET ;
R DBX [AR1,P#14.0]; //SEW_SBP_Daten.COMMUNICATION_OK
R DBX [AR1,P#14.1]; //SEW_SBP_Daten.FAULT_OF_AXIS
R DBX [AR1,P#14.2]; //SEW_SBP_Daten.WARNING_OF_AXIS
R DBX [AR1,P#14.3]; //SEW_SBP_Daten.INVERTER_READY
R DBX [AR1,P#14.4]; //SEW_SBP_Daten.AXIS_INTERLOCKED
R DBX [AR1,P#14.5]; //SEW_SBP_Daten.NOT_REFERENCED
R DBX [AR1,P#14.6]; //SEW_SBP_Daten.REFERNCED
R DBX [AR1,P#14.7]; //SEW_SBP_Daten.TARGET_POS_REACHED
END_FUNCTION