Per TCP/IP an die SIMATIC S7 über HMI/PG Protokoll (RFC1006)
Dokumentation zur Version 1.76
Das Tool ist in purem C/C++ Code entwickelt. Es lässt sich so auf jede beliebige Plattform / Architektur mit geringstem Aufwand portieren. Release Notes
php.ini: extension = ips7lnk_php.dll
im Programm: ld ('ips7lnk_php.dll');
php.ini: extension = ips7lnk_php.so
im Programm: ld ( ́ips7lnk_php.so’);
Für den Zugriff auf die S7-300/400 sind keine besonderen Einstellungen zu tätigen. Es sollte nur nur IP-Adresse, Rack und Slot bekannt sein. In der Regel Rack:0, Slot:2. Slot ist die Nummer des Slots, in dem die CPU steckt.
Bei SPS direkt eingebauter Ethernet-Schnittstelle ist das Slot 1.
Netzsicht
PC-System mit einem Port
hinzu
Hinzufügen
und Schließen
sehen Sie eine undefinierte VerbindungAllgemein
die Partner-IP-Adresse einEigenschaften
)Adressdetails
sehen Sie folgende Eingabemaske
Verbindungsres (hex)
) für den Lokal und Partner aus Besondere Verbindungseigenschaften
deaktivieren Sie Aktiver Verbindugsaufbau
Wenn Sie nun die eingestellten LocalTSAP und RemoteTSAP verwenden, sollten Sie auf die Daten zugreifen können
1. Stellen Sie über die Logo!Soft Comfort die IP-Adresse der SPS ein:
2. Konfigurieren Sie die Logo!-SPS so, dass Verbindungen von einem HMI-Gerät angenommen werden. Gehen Sie dazu auch „Extras→Ethernetverbindungen“ und fügen dann eine neue Verbindung hinzu.
3. Machen Sie einen Doppelklick auf die neu angelegte Verbindung, um in die Eigenschaften zu gelangen.
Wählen Sie: - Server-Verbindung - lokaler TSAP: 02.00 - dezentraler TSAP 02.00 - alle Verbindungen akzeptieren.
Sie können auf DB1, Eingänge, Ausgänge, Merker, Zähler und Timer mit IP-S7-LINK zugreifen. Legen Sie nun über „Extras→Parameter-VM-Zuordnung“ die Variablen fest, die in den DB1 übertragen werden sollen.
Bilder aus Siemens Support Portal
IP-S7-LINK realisiert die Anbindung eines PC an Industrial Ethernet der SIMATIC S7.
Die Library ist für die verschiedene Programmiersprachen, Betriebssystem, Architekturen und Plattformen verfügbar.
Das Tool ist in purem C/C++ Code entwickelt. Es lässt sich so auf jede beliebige Plattform / Architektur mit geringstem Aufwand portieren.
Die Library stellt die notwendigen Funktionen zur Kommunikation bereit.
Die Verbindung zur SPS wird von IP-S7-LINK eigenständig kontrolliert und im Fehlerfall automatisch wieder hergestellt.
Zur Kopplung wird nur die IP-Adresse der SPS / CP sowie der Steckplatz der CPU im SPS- Rack benötigt.
Sofort können Merker, Eingänge, Ausgänge, Datenbausteine, SPS-Zeit etc. gelesen und geschrieben werden.
Bitte beachten Sie: Die Funktionen werden mit der Standard Socket-Schnittstelle ausgeführt, was zur Folge hat, dass die Funktion erst nach Erfüllung der Aufgabe zum Aufrufer zurückkehrt.
Zum asynchronen Betrieb rufen Sie diese Funktionen einfach von einem separaten Thread aus auf, welcher für die Kommunikation des Systems zuständig ist. Folgende Funktionen stehen zur Verfügung:
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7Open | ips7_open | zur Initialisierung der Verbindung, dort wird nur Speicher vorbereitet. Beim ersten Aufruf der Lese- oder Schreibfunktionen wird die TCP/IP-Verbindung automatisch gestartet. Die Verbindung wird über den OP-Kanal hergestellt. |
IPS7OpenPG | ips7_openpg | Ab Version 1.17, zur Initialisierung der Verbindung, dort wird nur Speicher vorbereitet. Beim ersten Aufruf der Lese- oder Schreibfunktionen wird die TCP/IP-Verbindung automatisch gestartet. Die Verbindung wird über den PG-Kanal hergestellt. |
IPS7OpenS7200 | ips7_opens7200 | Ab Version 1.21, zur Initialisierung der Verbindung, dort wird nur Speicher vorbereitet. Beim ersten Aufruf der Lese- oder Schreibfunktionen wird die TCP/IP-Verbindung automatisch gestartet. Die Verbindung wird zu einer S7-200 hergestellt. |
Nr | Datentyp | PHP-Datentyp | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit Pointer auf C-String | string | IPAdr | IP-Adresse der SPS im Format: xxx.xxx.xxx.xxx. Beispiel: „192.169.0.100“ |
2 | 32-Bit unsigned | long | Rack | Nummer des Rack’s, in dem die SPS-CPU gesteckt ist. Die Zählung beginnt mit „0„. Normalerweise 0. Bei S7-200 egal |
3 | 32-Bit unsigned | long | Slot | Nummer des Steckplatzes der CPU beginnend mit „1“, normalerweise „2„ Bei S7-300-400 oder „1“ bei S7-1200/1500. Bei S7-200 egal |
4 | 32-Bit unsigned | long | RxTimeout | Timeout in Millisekunden für Warten auf TCP/IP-Paket von der SPS, 0 bedeutet Standardeinstellung = 500 ms |
5 | 32-Bit unsigned | long | TxTimeout | Timeout in Millisekunden für Senden eines TCP/IP-Paketes an die SPS, 0 bedeutet Standardeinstellung = 500 ms |
6 | 32-Bit unsigned | long | ConTimeout | Timeout in Millisekunden für Warten auf Verbindungsaufbau mit SPS, 0 bedeutet Standardeinstellung = 5000 ms muss bei Bedarf verlängert werden |
extern long WINAPI IPS7Open (LPCTSTR IPAdr, DWORD Rack, DWORD Slot, DWORD RxTimeout, DWORD TxTimeout, DWORD ConnectTimeout); extern long WINAPI IPS7OpenPG (LPCTSTR IPAdr, DWORD Rack, DWORD Slot, DWORD RxTimeout, DWORD TxTimeout, DWORD ConnectTimeout); extern long WINAPI IPS7OpenS7200 (LPCTSTR IPAdr, DWORD Rack, DWORD Slot, DWORD RxTimeout, DWORD TxTimeout, DWORD ConnectTimeout);
FUNCTION IPS7Open (IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7OpenPG (IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7OpenS7200 (IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7Open& Lib "IPS7LNK.dll" (ByVal IPAdr As String, _ ByVal Rack&, ByVal Slot&, _ ByVal RxTimeout&, _ ByVal TxTimeout&, _ ByVal ConnectTimeout&)
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7OpenEx | ips7_openex | Ab Version 1.23, zur Initialisierung der Verbindung, dort wird nur Speicher vorbereitet. Beim ersten Aufruf der Lese- oder Schreibfunktionen wird die TCP/IP-Verbindung automatisch gestartet. Es können durch die Wahl der Parameter OP/PG S7200 oder auch Verbindungen über ein Subnetz hergestellt werden. |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit pointer auf C-String | string | IPAdr | IP-Adresse der SPS im Format: xxx.xxx.xxx.xxx. Beispiel: 192.169.0.100 |
2 | 32-Bit unsigned | long | Rack | Nummer des Rack’s, in dem die SPS-CPU gesteckt ist. Die Zählung beginnt mit „0“. Normalerweise 0. Bei S7-200 egal |
3 | 32-Bit unsigned | long | Slot | Nummer des Steckplatzes der CPU beginnend mit „1„, normalerweise „2“ bei S7-300-400 oder „1“ bei S7-1200/1500. Bei S7-200 egal |
4 | 32-Bit unsigned | long | SubNet-Id | Subnetz-ID, wenn über ein Subnet zugegriffen werden soll. In der Step-S7 Software wird die Adresse z.B. so dargestellt: 0035 – 0001, geben Sie dann 0x00350001 an. Wird nur bei AccessMode 10 oder 11 verwendet |
5 | 32-Bit unsigned | long | DstMPIAdr | Ziel-MPI-Adresse, wenn über ein Subnetz die Verbindung aufgebaut werden soll. Siehe AccessMode 10 und 11! |
6 | 32-Bit unsigned | long | AccessMode | Art des Zugriffs: 0 = OP-Verbindung zur durch Rack und Slot angegebene CPU aufbauen 1 = PG-Verbindung zur durch Rack und Slot angegebene CPU aufbauen 2 = Verbindung zu einer S7-200 über gesteckten TCP/IP-CP 3 = Verbindung einer Siemens-Logo-SPS (ab 1.60.78) 4 = Verbindung über den Kanal „Sonstige“ (ab 1.60.79) 10 = OP-Verbindung über Subnetz, welches an der durch Rack und Slot angegebene CPU angeschlossen ist aufbauen, Subnet-Id und DstMPI Adresse sind anzugeben 11 = PG-Verbindung über Subnetz, welches an der durch Rack und Slot angegebene CPU angeschlossen ist aufbauen, SubnetId und DstMPI Adresse sind anzugeben 20 = Verbindung zu S5-LAN++. Die Konvertierung der Realwerte erfolgt dann auch bei MultiRead-Zugriffen |
7 | 32-Bit unsigned | long | RxTimeout | Timeout in Millisekunden für Warten auf TCP/IP-Paket von der SPS, 0 bedeutet Standardeinstellung = 500 ms |
8 | 32-Bit unsigned | long | TxTimeout | Timeout in Millisekunden für Senden eines TCP/IP-Paketes an die SPS, 0 bedeutet Standardeinstellung = 500 ms |
9 | 32-Bit unsigned | long | ConTimeout | Timeout in Millisekunden für Warten auf Verbindungsaufbau mit SPS, 0 bedeutet Standardeinstellung = 5000 ms ( 5sec.) muss bei Bedarf verlängert werden. |
extern long WINAPI IPS7OpenEx (LPCTSTR IPAdr, DWORD Rack, DWORD Slot, DWORD SubNetId, DWORD DstMPIAdr, DWORD AccessMode, DWORD RxTimeout, DWORD TxTimeout, DWORD ConnectTimeout);
FUNCTION IPS7OpenEx (IPAdr : PChar; Rack : LongWord; Slot : LongWord; SubNetId : LongWord; DstMPIAdr : LongWord; AccessMode : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7OpenEx& Lib "IPS7LNK.dll" (ByVal IPAdr As String, _ ByVal Rack&, ByVal Slot&, _ ByVal SubNetId&, ByVal DstMPIAdr&, ByVal AccessMode&, _ ByVal RxTimeout&, _ ByVal TxTimeout&, _ ByVal ConnectTimeout&)
Arbeitet wie IPS7OpenEx. Jedoch bietet diese Funktion die Möglichkeit, den LocalTSAP und RemoteTSAP anzugeben. So ist es möglich eine beliebige Verbindung zur SPS mit freier TSAP-Wahl zu verwenden. Die Länge der TSAPs ist auf 2 Byte festgelegt.
Dies kann z.B. für die Verbindung mit einer Logo8 Anwednung finden. Dort kann der TSAP für den Kanal festgelegt werden.
Beispiel: Wenn in der SPS vorgegeben ist.
Also beachten: Local / Remote bezieht sich auf die Sichtweise zum Partner.
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7OpenExWithTSAP | ips7_openexwithtsap |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit pointer auf C-String | string | IPAdr | IP-Adresse der SPS im Format: xxx.xxx.xxx.xxx. Beispiel: 192.169.0.100 |
2 | 32-Bit unsigned | long | Rack | Nummer des Rack’s, in dem die SPS-CPU gesteckt ist. Die Zählung beginnt mit „0„. Normalerweise 0. Bei S7-200 egal |
3 | 32-Bit unsigned | long | Slot | Nummer des Steckplatzes der CPU beginnend mit „1“, normalerweise „2„ bei S7-300-400 oder „1“ bei S7-1200/1500. Bei S7-200 egal |
4 | 32-Bit unsigned | long | SubNet-Id | Subnetz-ID, wenn über ein Subnet zugegriffen werden soll. In der Step-S7 Software wird die Adresse z.B. so dargestellt: 0035 – 0001, geben Sie dann 0x00350001 an. Wird nur bei AccessMode 10 oder 11 verwendet |
5 | 32-Bit unsigned | long | DstMPIAdr | Ziel-MPI-Adresse, wenn über ein Subnetz die Verbindung aufgebaut werden soll. Siehe AccessMode 10 und 11! |
6 | 32-Bit unsigned | long | AccessMode | Art des Zugriffs: 0 = OP-Verbindung zur durch Rack und Slot angegebene CPU aufbauen 1 = PG-Verbindung zur durch Rack und Slot angegebene CPU aufbauen 2 = Verbindung zu einer S7-200 über gesteckten TCP/IP-CP 3 = Verbindung einer Siemens-Logo-SPS (ab 1.60.78) 4 = Verbindung über den Kanal „Sonstige“ (ab 1.60.79) 10 = OP-Verbindung über Subnetz, welches an der durch Rack und Slot angegebene CPU angeschlossen ist aufbauen, Subnet-Id und DstMPI Adresse sind anzugeben 11 = PG-Verbindung über Subnetz, welches an der durch Rack und Slot angegebene CPU angeschlossen ist aufbauen, SubnetId und DstMPI Adresse sind anzugeben 20 = Verbindung zu S5-LAN++. Die Konvertierung der Realwerte erfolgt dann auch bei MultiRead-Zugriffen |
7 | 32-Bit unsigned | long | RxTimeout | Timeout in Millisekunden für Warten auf TCP/IP-Paket von der SPS, 0 bedeutet Standardeinstellung = 500 ms |
8 | 32-Bit unsigned | long | TxTimeout | Timeout in Millisekunden für Senden eines TCP/IP-Paketes an die SPS, 0 bedeutet Standardeinstellung = 500 ms |
9 | 32-Bit unsigned | long | ConTimeout | Timeout in Millisekunden für Warten auf Verbindungsaufbau mit SPS, 0 bedeutet Standardeinstellung = 5000 ms ( 5sec.) muss bei Bedarf verlängert werden. |
10 | pointer auf BYTE Array der Länge 2 | BYTE * | LocalTSAP | |
11 | pointer auf BYTE Array der Länge 2 | BYTE * | RemoteTSAP |
extern long WINAPI IPS7OpenExWithTSAP (LPCTSTR IPAdr, DWORD Rack, DWORD Slot, DWORD SubNetId, DWORD DstMPIAdr, DWORD AccessMode, DWORD RxTimeout, DWORD TxTimeout, DWORD ConnectTimeout, BYTE *LocalTSAP, BYTE *RemoteTSAP;
FUNCTION IPS7OpenExWithTSAP (IPAdr : PChar; Rack : LongWord; Slot : LongWord; SubNetId : LongWord; DstMPIAdr : LongWord; AccessMode : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord; LocalTSAP :PBYTE, RemoteTSAP :PBYTE ) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7OpenExWithTSAP& Lib "IPS7LNK.dll" (ByVal IPAdr As String, _ ByVal Rack&, ByVal Slot&, _ ByVal SubNetId&, ByVal DstMPIAdr&, ByVal AccessMode&, _ ByVal RxTimeout&, _ ByVal TxTimeout&, _ ByVal ConnectTimeout&, _ LocalTSAP as Byte, _ RemoteTSAP as Byte, _ )
Wert | Fehlerbeschreibung | Bedeutung |
---|---|---|
>= 0 | Alles OK | Der Returnwert ist die Referenznummer für diese Verbindung und muss bei allen anderen Funktionen als Eingangsparameter Ref verwendet werden |
-2 | Keine Ressourcen mehr frei | Maximale Anzahl an verfügbaren Verbindungen erreicht |
-10 | AccessMode nicht möglich (ab 1.23) | wenn eine unzulässige Nummer für AccessMode angegeben wird. Siehe IPS7OpenEx |
Dient zur Deinitialisierung der Verbindung, Speicher wird freigegeben und die TCP/IP-Verbindung wird getrennt.
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit Wert unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
extern long WINAPI IPS7Close (long Ref);
FUNCTION IPS7Close (Ref : LongInt) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7Close& Lib "IPS7LNK.dll" (ByVal Ref&)
Return-Wert Die Funktion liefert einen 32-Bit Wert mit Vorzeichen als Return-Wert mit folgender Bedeutung: |
||
---|---|---|
Wert | Fehlerbeschreibung | Bedeutung/Reaktion |
0 | alles OK | Speicher wieder freigegeben und Verbindung, wenn vorhanden, geschlossen |
-3 | Mit der angegebenen Referenznummer wurde kein IPS7Open durchgeführt | Haben Sie IPS7Open aufgerufen? |
-99 | Die Referenznummer ist ungültig | |
-30 | nur PHP | Die Anzahl oder der Typ der übergebenen Parameter ist falsch |
-31 | nur PHP | Die interne Konvertierung der Daten konnte nicht durchgeführt werden, z.B. wurde ein String übergeben, wo long notwendig ist |
Führt einen explizierten Verbindungsaufbau zur SPS aus. Ab Version 1.35! Damit kann ohne Lese/Schreibauftrag die Verbindung zur SPS hergestellt werden.
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
extern long WINAPI IPS7Connect (long Ref);
FUNCTION IPS7Connect (Ref : LongInt) : LongInt; stdcall; external 'IPS7LNK.DLL';
Wert | Fehlerbeschreibung |
---|---|
1 | Verbindung wurde hergestellt |
⇐ 0 | Verbindung konnte nicht hergestellt werden. Die genaue Bedeutung finden Sie bei den Return-Werten für die Lese- / Schreibfunktionen |
Prüft den TCP/IP Verbindungsstatus zur SPS.
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
extern long WINAPI IPS7GetConnectStatus (long Ref);
FUNCTION IPS7GetConnectStatus ( Ref : LongInt) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7GetConnectStatus& Lib "IPS7LNK.dll" (ByVal Ref&)
Wert | Fehlerbeschreibung |
---|---|
1 | Verbindung wurde hergestellt und besteht |
⇐ 0 | Verbindung ist unterbrochen. Evtl. IPS7Connect, Lese- oder Schreibfunktion aufrufen |
Ab V 1.35!
Setzt individuelle TCP/IP KeepAlive Zeiten für die mit Ref angegebene Verbindung. Muss nur verwendet werden, wenn die Standardwerte nicht gelten sollen.
Sie sollten diese Funktion unmittelbar nach dem „Open“- Aufruf ausführen.
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-bit unsigned | long | AliveTime | Findet innerhalb der Zeit AliveTime (ms) kein Datenverkehr auf der TCP/IP-Verbindung statt, so wird ein KeepAlive-Telegram gesendet, um die Verbindung zu prüfen. Wird bei dieser Prüfung ein Fehler festgestellt, sendet der IP-Stack innerhalb der Zeit AliveInterval (ms) ein nächstes KeepAlive-Telegram. Dies wird einige male innerhalb der Zeit AliveInterval wiederholt (Win 6mal). War der Vorgang nicht erfolgreich, wird die Verbindung beendet |
3 | 32-bit unsigned | long | AliveInterval | Das Intervall in ms, in welchem KeepAlive-Telegramme wiederholt werden. Dieses wird aktiv, wenn ein Fehler beim Senden / Empfangen eines KeepAlive-Telegramms aufgetreten ist |
extern long WINAPI IPS7SetKeepAlive (long Ref, DWORD AliveInterval, DWORD AliveTime);
FUNCTION IPS7SetKeepAlive (Ref : LongInt; AliveInterval : Longword; AliveTime : Longword) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7SetKeepAlive& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal AliveInterval&, ByVal AliveTime&)
Wert | Fehlerbeschreibung |
---|---|
0 | Setzen der Werte war erfolgreich |
< 0 | Das Setzen der Keep-Alive-Zeit konnte nicht ausgeführt werden |
Standardmässig wird der TCP/IP-Port 102 (RFC 1006) verwendet. Mit IPS7SetTCPPort lässt sich dieser verändern. Sie sollten diese Funktion unmittelbar nach dem „Open“- Aufruf ausführen.
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-Bit unsigned | long | Port | Die Nummer des neuen TCP/IP-Ports 1 - 65565 |
extern long WINAPI IPS7SetTCPPort (long Ref, unsigned long Port);
FUNCTION IPS7SetTCPPort (Ref : LongInt, Port : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
Wert | Fehlerbeschreibung | Bedeutung/Reaktion |
---|---|---|
0 | alles OK | Speicher wieder freigegeben und Verbindung, wenn vorhanden, geschlossen |
-3 | Mit der angegebenen Referenznummer wurde kein IPS7Open durchgeführt | Haben Sie IPS7Open aufgerufen? |
-99 | Die Referenznummer ist ungültig | |
-30 | nur PHP | Die Anzahl oder der Typ der übergebenen Parameter ist falsch |
-31 | nur PHP | Die interne Konvertierung der Daten konnte nicht durchgeführt werden, z.B. wurde ein String übergeben, wo long notwendig ist |
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7GetSockErr | ips7_getsockerr | Liefert den letzten Socket-Fehler zurück |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
extern long WINAPI IPS7GetSockErr (long Ref);
FUNCTION IPS7GetSockErr (Ref : LongInt) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7GetSockErr& Lib "IPS7LNK.dll" (ByVal Ref&)
Wert | Fehlerbeschreibung | Bedeutung / Reaktion |
---|---|---|
0 | alles OK | Es liegt kein Fehler an |
-3 | Mit der angegebenen Referenznummer wurde kein IPS7Open durchgeführt | Haben Sie IPS7Open aufgerufen? |
-99 | Die Referenznummer ist ungültig | |
Sonstige | Socketerror | Erklärung siehe Liste unterhalb |
IP-S7-LINK stellt für jeden Datentyp eine Funktionen zum Lesen und Schreiben bereit.
Die Datenyp-Funktionen unterscheiden sich in den Aufrufparametern. Im Folgenden sind die Methoden mit gleichen Parametern in Gruppen zusammengefasst.
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdB | ips7_rdb | bytweise lesen (E,A,P,M,DB) |
IPS7WrB | ips7_wrb | byteweise schreiben (E,A,P,M,DB,Z) |
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdW | ips7_rdw | wortweise lesen (E,A,P,M,DB) |
IPS7RdPlcW | ips7_rdplcw | wortweise lesen (E,A,P,M,DB) jedoch Startadresse nach SPS-Adressierung damit ein Zugriff auf ungerade Startadressen möglich ist |
IPS7WrW | ips7_wrw | wortweise schreiben (E,A,P,M,DB,Z) |
IPS7WrPlcW | ips7_wrplcw | wortweise schreiben (E,A,P,M,DB,Z) jedoch Startadresse nach SPS-Adressierung, (ab 1.17) damit ist ein Zugriff auf ungerade Startadressen möglich ist |
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdDW | ips7_rddw | doppelwortweise lesen (E,A,P,M,DB,T) |
IPS7WrDW | ips7_wrdw | doppelwortweise schreiben (E,A,P,M,DB,T) |
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdReal | ips7_rdreal | Real (Fließpunktzahl) lesen (E,A,P,M,DB)) |
IPS7WrReal | ips7_wrreal | Real (Fließpunktzahl) schreiben (E,A,P,M,DB)) |
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdLInt | ips7_rdlint | LInt (64 Bit) lesen (E,A,P,M,DB) |
IPS7WrLInt | ips7_wrlint | LInt (64 Bit) schreiben (E,A,P,M,DB) |
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdULInt | ips7_rdulint | ULInt (64 Bit) lesen (E,A,P,M,DB) |
IPS7WrULInt | ips7_wrulint | ULInt (64 Bit) schreiben (E,A,P,M,DB) |
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdString | ips7_rdstring | String lesen (E,A,P,M,DB) Startadresse nach SPS-Adressierung 1.Byte mögliche Länge 2. Byte tatsächliche Länge ab 3. Byte Daten (Bsp. Adresse: DB0.DBB0, ab DB0.DBB2 stehen die tatsächlichen Daten). IP-S7-LINK liest mögliche Länge des Strings aus → kürzt auf tatsächliche Länge → fügt NULL-CHAR ('\0') am Ende hinzu |
IPS7WrString | ips7_wrstring | String schreiben (E,A,P,M,DB) Startadresse nach SPS-Adressierung. Der String muss mit NULL-CHAR ('\0') abgeschlossen sein. Die Länge des übergebenen String wird automatisch ermittelt und beim Schreiben des Inhaltes in den S7-STRING der SPS geschrieben. Achtung! Definieren Sie Ihren Datenbereich groß genug, damit es zu keiner Überschreibung vorhandener Prozessdaten kommen kann |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-Bit unsigned | long | Typ | Die Auswahl des Speicherbereichs in der SPS (DB, Eingang, Ausgang, Merker), welcher bearbeitet werden soll: 'D' = 68 dez. steht für Datenbaustein 'E' = 69, dez. steht für Eingänge 'A' = 65 dez. steht für Ausgänge 'M' = 77 dez. steht für Merker 'P' = 80 dez. steht für Peripherie 'T' = 84 dez. steht für Timer (nur mit Doppelwortfunktionen möglich). Die Timer werden in der SPS mit Zeitbasis und Wert im BCD-Format gespeichert. Um dieses Format sofort im PC verarbeiten zu können, führt der Treiber eine automatische Konvertierung in Millisekunden durch. Das kleinst mögliche Raster ist 10 ms. Beim Schreiben in die SPS wählt der Treiber automatisch eine passende Zeitbasis. Dabei kann es zu Rundungen kommen. Der Zeitbereich geht von 0 bis 9990000 ms 'Z' = 90 dez. steht für Zähler (nur mit Wortfunktionen möglich). Auch die Zähler sind in der SPS BCD-Codiert abgelegt. Die Zählerwerte reichen von 0 – 999 |
3 | 32-Bit unsigned | 32-Bit Wert unsigned | DBNr | Datenbausteinnummer, diese wird nur beim Typ 'D' verwendet. Ansonsten steht dort der Wert „0“ |
4 | 32-Bit unsigned | 32-Bit Wert unsigned | Ab | Erstes Wort bzw. Byte ab dem gelesen bzw. geschrieben werden soll. Bei Wortoperationen Startwort Bei Byte, Doppelwort und Realfunktionen Startbyte Bei Timer oder Zähler ist dies die Nummer des ersten Elements, welches gelesen werden soll |
5 | 32-Bit unsigned | 32-Bit Wert unsigned | Anz | Anzahl der Einheiten (Byte, Worte, Doppelworte Real, oder Einheiten, z.B. Timer), die gelesen bzw. geschrieben werden sollen |
6 | 32-Bit Pointer | mixed | Buffer | Die Adresse auf den Quell- bzw. Zielspeicher im PC. Bei den Wortfunktionen ist dies ein Zeiger auf ein Feld von 16-Bit breiten Worten Bei den Bytefunktionen ist das eine Adresse auf ein Feld mit 8-Bit breiten Bytes Bei Doppelwort Zeiger auf Long Bei Real Zeiger auf einen Double |
Hinweis für PHP: Bei PHP geben Sie hier die Referenz einer Variablen an |
||||
Bemerkung zu ips7_rdplcw, ips7_rdw, ips7_rddw, ips7_rdreal }} Aufruf z.B.: &Result = ips7_rdplcw ($Ref, ord („M“), 0, 6,5, &$W); | ||||
Werden mehr als 1 Element gelesen, so wird die Variable in ein Array vom Typ long bzw. double umgewandelt. Wird nur ein Wert gelesen und die Variable ist kein Array, wird der Wert als long gespeichert Ist die Variable bereits ein Array und es wird nur ein Wert gelesen, so wird das Ergebnis im ersten Element des Array abgelegt. Doppelworte (ips7_rddw) werden grundsätzlich mit Vorzeichen verarbeitet (signed) |
||||
7 | ——— | long (optional) | bSigned bei ipss7_rdplcw, ips7_rdw, ips7_wrplcw, ips7_wrdw bLong bei ips7_rdb | Hinweis für PHP: ips7_rdplcw, ips7_rdw, ips7_wrplcw, ips7_wrdw Optional kann bestimmt werden, ob die Werte als signed oder unsigned 16-Bit-Integer gelesen werden sollen. Wird der Parameter nicht angegeben, wird grundsätzlich mit Vorzeichen gearbeitet (signed). Wir der Parameter übergeben gilt: 0 = ohne Vorzeichen (signed) 1 = mit Vorzeichen \\Außerdem stehen für eine nachträgliche Konvertierung einzelner Werte die Funktionen ips7_i2w und ips7_w2i zu Verfügung. Näheres finden Sie dort.ips7_rdbIps7_rdb speichert das Ergebnis grundsätzlich als string. Wollen Sie jedoch die Werte einfach als Array ansprechen, so können Sie mit bLong = 1 das Ergebnis als long.Array ablegen lassen. |
Der PC und die SPS haben verschiedene Adressierungsarten. In der S7 ist der Speicherbereich byteweise orientiert. So adressieren Sie aus der Sicht des SPS-Programmierers mit MW 0 das MB0 und MB1, mit MW1 aber das MB1 und MB2. Sie sehen, dass sich MW0 und MW1 im MB1 überschneiden.
Vor der Version 1.17 war es nur möglich auf gerade Startadressen mit den Wortfunktionen zuzugreifen. Ab V 1.17 ist mit den Funktionen S7RdPlcW und S7WrPlcW ein Zugriff auf ungerade Startadressen möglich. Wollen Sie nun MW 1 lesen, so wie der SPS-Programmierer das sieht rufen Sie auf:
IPS7RdPlcW (Ref, 'M', 0, 1, 1, WortBuffer);
!!! Beachten Sie das bei Wortoperationen mit S7RdW und S7WrW!!!
Beispiel für Merker. Dies gilt auch für Eingänge, Ausgänge und Datenworte. Die Wortadressierung in der SPS belegt jeweils folgende Bytes:
Wortadresse | zugeordnete Bytes |
---|---|
MW0 | MB 0 und MB 1 |
MW1 | MB 1 und MB 2 |
MW2 | MB 2 und MB 3 |
Sie sehen, dass es bei Verwendung von ungeraden Wortadressen zu einer Doppelbelegung kommen kann. Deshalb unterstützen die Wortfunktionen (IPS7RdW und IPS7WrW) nur den Zugriff auf gerade Wortadressen. Dies bedeutet, dass die Start-Wort-Nr im Treiber immer mit 2 multipliziert wird. Diese Methode erlaubt zu dem ein einfaches Abbild des SPS-Speichers in den PC. Also ein Wortschritt im PC sind 16 Bit im PC und 16 Bit in der SPS.
Beispiel:
WORD Buf[64];
Der Aufruf IPS7RdW (Ref, Typ, DBNr, 0, 5, Buf) hat folgende Wirkung:
PC | SPS |
---|---|
Buf[0] | DW 0 |
Buf[1] | DW 2 |
Buf[2] | DW 4 |
Sie müssen also die Start-Wortnummer halbieren, um im PC richtig zugreifen zu können. Dies gilt auch für Datenbausteine –> Ungerade Wortadressen der SPS können nicht wortweise gelesen oder geschrieben werden.
Wollen Sie trotzdem auf ungerade Startadressen adressieren verwenden Sie die Funktionen S7RdPlcW und S7WrPlcW.
long ips7_w2i(mixed Buffer,long Count);
Konvertiert unsigned 16-Bit - Werte in signed 16-Bit Werte
long ips7_i2w(mixed Buffer, long Count);
Konvertiert signed 16-Bit - Werte in unsigned 16-Bit Werte
Parameter | Beschreibung / Zweck |
---|---|
Buffer | Referenz auf die long Werte (Array) oder den long Wert, der konvertiert werden soll |
Count | Anzahl der Werte |
extern long WINAPI IPS7RdW (long Ref, DWORD Typ, DWORD DBNr, DWORD AbWort, DWORD WortAnz, LPWORD Buffer) ; extern long WINAPI // 1.17 IPS7RdPlcW (long Ref, DWORD Typ, DWORD DBNr, DWORD AbWort, DWORD WortAnz, LPWORD Buffer) ; extern long WINAPI IPS7RdB (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, LPBYTE Buffer); extern long WINAPI IPS7WrW (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, LPWORD Buffer); extern long WINAPI // 1.17 IPS7WrPlcW (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, LPWORD Buffer); extern long WINAPI IPS7WrB (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, LPBYTE Buffer); extern long WINAPI IPS7RdDW (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, LPDWORD Buffer); extern long WINAPI IPS7WrDW (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, LPDWORD Buffer); extern long WINAPI IPS7RdReal (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, double *Buffer); extern long WINAPI IPS7WrReal (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, DWORD Anz, double *Buffer); extern long WINAPI IPS7RdULInt (long Ref, DWORD Typ, DWORD DBNr, DWORD Start, DWORD Cnt, UINT64 *Buffer) ; extern long WINAPI IPS7WrULInt (long Ref, DWORD Typ, DWORD DBNr, DWORD Start, DWORD Cnt, UINT64 *Buffer) ; extern long WINAPI IPS7RdLInt (long Ref, DWORD Typ, DWORD DBNr, DWORD Start, DWORD Cnt, INT64 *Buffer); extern long WINAPI IPS7WrLInt (long Ref, DWORD Typ, DWORD DBNr, DWORD Start, DWORD Cnt, INT64 *Buffer);
FUNCTION IPS7RdW (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PWORD) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdPlcW (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PDWORD) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdB (Ref : LongInt; Typ : Longword; DBNr: Longword; Ab : Longword; Anz : Longword; Buffer: PBYTE) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrW (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PWORD) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrPlcW (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PDWORD) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrB (Ref : LongInt; Typ : Longword; DBNr: Longword; Ab : Longword; Anz : Longword; Buffer : PBYTE) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdDW (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PDWORD) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrDW (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PDWORD) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdReal (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PDOUBLE) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrReal (Ref : LongInt; Typ : Longword; DBNr : Longword; AbWort : Longword; WortAnz : Longword; Buffer : PDOUBLE) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7RdW& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Integer) Declare Function IPS7RdPlcW& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Integer) Declare Function IPS7RdB& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Byte) Declare Function IPS7WrW& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Integer) Declare Function IPS7WrW& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Integer) Declare Function IPS7WrB& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Byte) Declare Function IPS7RdDW& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Long) Declare Function IPS7WrDW& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Long) Declare Function IPS7RdReal& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Double) Declare Function IPS7WrReal& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal AbWort&, ByVal WortAnz&, Wert As Double)
extern long WINAPI IPS7RdStr (long Ref, DWORD Typ, DWORD DBNr, DWORD Start, DWORD Cnt, LPSTR Buffer); extern long WINAPI IPS7WrStr (long Ref, DWORD Typ, DWORD DBNr, DWORD Ab, LPSTR Buffer);
FUNCTION IPS7RdStr (Ref : LongInt; Typ : Longword; DBNr : Longword; Start : Longword; Cnt : Longword; Buffer : ANSISTRING) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrStr (Ref : LongInt; Typ : Longword; DBNr : Longword; Ab : Longword; Buffer : ANSISTRING) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7RdStr& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal Start&, ByVal Cnt&, Wert As String) Declare Function IPS7WrStr& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal Ab&, Wert As String)
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-Bit unsigned | long | Typ | Die Auswahl des Speicherbereichs in der SPS (DB, Eingang, Ausgang, Merker), welcher bearbeitet werden soll: 'D' = 68 dez. steht für Datenbaustein 'E' = 69, dez. steht für Eingänge 'A' = 65 dez. steht für Ausgänge 'M' = 77 dez. steht für Merker 'P' = 80 dez. steht für Peripherie |
3 | 32-Bit unsigned | long | DBNr | Datenbausteinnummer, diese wird nur beim Typ 'D' verwendet. Ansonsten steht dort der Wert „0„ |
4 | 32-Bit unsigned | long | Ab | Byte Adresse z.B. M 10.0, dann steht hier 10. Beachten Sie hier den Unterschied zwischen IPS7RdW und IPS7RdPlcW bzw. IPS7WrW und IPS7WrPlcW. Siehe weiter unten! |
5 | 32-Bit unsigned | long | Bit | BitNr muss zwischen 0 und 7 liegen, z.B. bei M5.4 steht hier 4 |
6 | 32-Bit Adresse | mixed | Buffer | Dieser Parameter ist nur für IPS7RdBit Die Adresse auf den Zielspeicher im PC. Zeiger auf ein Byte. Wenn bBit gesetzt ist Inhalt 1 sonst 0. Beispiel: lese M 6.5 BYTE W; IPS7RdBit (Ref, 'M', 0, 6,5 & W); Hinweis für PHP: Bei PHP geben Sie als hier die Referenz einer Variablen an: ips7_rdbit (Ref, ord („M“), 0, 6,5, & $W); Diese Variable wird automatisch in einen „long“ konvertiert. Verwenden Sie daher eine Variable, die sonst noch nicht verwendet wurde. Der Zustand des Bit’s (0 oder 1) ist somit als long gespeichert |
<code c> extern long WINAPI IPS7RdBit (long Ref, DWORD Typ, DWORD DBNr, DWORD Byte, DWORD Bit, LPBYTE Buffer); extern long WINAPI IPS7SetBit (long Ref, DWORD Typ, DWORD DBNr, DWORD Byte, DWORD Bit); extern long WINAPI IPS7ResetBit (long Ref, DWORD Typ, DWORD DBNr, DWORD Byte, DWORD Bit);
FUNCTION IPS7RdBit (Ref : LongInt; Typ : Longword; DBNr: Longword; ByteNr : Longword; BitNr : Longword; Buffer: PBYTE) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7SetBit (Ref : LongInt; Typ : Longword; DBNr: Longword; ByteNr : Longword; BitNr : Longword) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7ResetBit (Ref : LongInt; Typ : Longword; DBNr: Longword; ByteNr : Longword; BitNr : Longword) : LongInt; stdcall; external 'IPS7LNK.DLL';
Declare Function IPS7RdBit& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal ByteNr&, ByVal BitNr&, Wert As Byte) Declare Function IPS7SetBit& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal ByteNr&, ByVal BitNr&) Declare Function IPS7ResetBit& Lib "IPS7LNK.dll" (ByVal Ref&, ByVal Typ&, ByVal DBNr&, ByVal ByteNr&, ByVal BitNr&)
FUNCTION IPS7RdULInt (Ref : LongInt; Typ : Longword; DBNr : Longword; Start : Longword; Cnt : Longword; Buffer : UInt64) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrULInt (Ref : LongInt; Typ : Longword; DBNr : Longword; Start : Longword; Cnt : Longword; Buffer : UInt64) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdLInt (Ref : LongInt; Typ : Longword; DBNr : Longword; Start : Longword; Cnt : Longword; Buffer : Int64) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7WrLInt (Ref : LongInt; Typ : Longword; DBNr : Longword; Start : Longword; Cnt : Longword; Buffer : Int64) : LongInt; stdcall; external 'IPS7LNK.DLL';
Erläuterungen zu PHP
In PHP sind die Variablen grundsätzlich keinem festen Datentyp zugeordnet. Die Bestimmung des Datentyps übernimmt deshalb das Erweiterungsmodul. Grundsätzlich gilt: Die Ziel- bzw. Quellvariable für den Lese / Schreibpuffer (=Parameter 6), muss als Referenz übergeben werden. Also das „&“ – Zeichen verwenden.
Z.B. $Res = ips7_rdplcw ($Ref, ord („M“), 0, 0, 2, &$Werte);
Werte[0] ist MW0
Werte[1] ist MW2
Da es in PHP keine 16-Bit-Werte gibt, werden die 16-Bit-Daten als long gespeichert. Die Wortfunktionen speichern das Ergebnis in einem long-Array, wird nur eine Einheit gelesen, so wird das Ergebnis als einzelner long gespeichert, wenn die Variable noch kein Array ist. Das Lesen- und Schreiben von Worten (16 Bit) geschieht grundsätzlich mit Vorzeichen. D.h. der Wert wird als 16-Bit integer interpretiert. Sollen die Werte als vorzeichenloser 16-Bit-Wert (unsigned) behandelt werden, beachten Sie dann den optionalen Parameter 7 (bSigned). Die Bytefunktionen speichern das Ergebnis grundsätzlich als string. Wollen Sie jedoch die Werte einfach als long Array ansprechen, so können Sie mit bLong = 1 das Ergebnis als long Array ablegen lassen.
Name | Name(PHP) | Beschreibung/Zweck |
---|---|---|
IPS7RdBit | ips7_rdbit | ein Bit lesen SPS (E,A,P,M,DB) |
IPS7SetBit | ips7_setbit | ein Bit setzen (E,A,P,M,DB) |
IPS7ResetBit | ips7_resetbit | ein Bit zurücksetzen in der SPS (E,A,P,M,DB) |
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7RdMulti | ips7_rdmulti | Führt einen gemischten Readauftrag aus. Für die Aufträge wird eine Liste/Array von Records / Structs des Typs „IPS7_RQ_MULTI„ ausgefüllt und der Funktion übergeben. Die Funktion sortiert und bündelt diese Aufträge und führt diese optimiert aus. ACHTUNG! Die Lesereihenfolge ist eine andere als die Reihenfolge der übergeben Liste |
IPS7RdMulti führt automatisch eine Datenkonvertierung zwischen S7 und PC durch. Die Konvertierung ist mit dem Datentyp-Casting in der Programmiersprache zu vergleichen. Die Bitbreite des Datentyps im PC muss gleich oder größer als der in der SPS sein.
Der Aufrufer hat einen entsprechend großen Zielbereich zur Verfügung zu stellen.
Das heißt: Sollen z.B. zwei 16-Bit Werte (gesamt 32 Bit) gelesen und in Doublewerte (64 Bit) im PC konvertiert werden, so müssen im PC auch zwei Doublewerte (insgesamt also 128 Bit) bereit gestellt werden.
Die Konvertierung sieht aus wie im Beispiel:
Wert in der SPS | Wert im PC |
---|---|
6 | 6.0 |
1 | 1.0 |
Die Auswahl der SPS- und PC-Datentypen erfolgt im Requestauftrag. Codiert über Konstanten wie im Folgendem beschrieben.
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7RdMultiCalcPacketCnt | ips7_rdmulticalcpacketcnt | Der Returnwert ist die Anzahl der benötigten Kommunikationspakete , die zum Lesen aller Multiread-Aufträge benötigt werden. Damit kann geprüft werden, ob alle gewünschten Variablen an einem Stück gelesen werden können. Dies ist der Fall, wenn der Returnwert == 1. Bitte den Returnwert beachten: >= 0 die Anzahl der Pakete < 0 es ist ein Fehler aufgetreten, Auswertung wie unten |
Wert | Fehlerbeschreibung | Reaktion |
---|---|---|
0 | Alles OK | Daten auswerten |
2 | Baustein oder Datenbereich existiert nicht, z.B. Zugriff auf DB, der nicht vorhanden oder zu klein ist | Überprüfen, ob der gewünschte Datenbereich in der SPS vorhanden ist |
-1 | Zeitüberlauf, gewünschte SPS offensichtlich nicht oder nicht mehr vorhanden | Einfach weitere Schreib- und Leseaufträge absetzen der Treiber baut die Verbindung automatisch auf. Evtl. die Timeoutzeiten insbesondere die Connect-Timeoutzeit verlängern |
-2 | Die maximale Anzahl (256) der möglichen Verbindungen ist erreicht | Unnötige Verbindungen schließen |
-3 | Kann bei Close auftreten. Mit der angegebenen Referenz wurde kein Open ausgeführt | Überprüfen Sie Ihren Quellcode, ob die Variable für die Referenz nicht überschrieben wurde. Oder es wurde für diese Referenz bereits ein Close ausgeführt |
-5 | Allgemeiner Fehler | Prüfen ob Netzwerk richtig im PC installiert ist: TCP/IP aktiviert? Winsocket installiert? |
-6 | Ziel-CPU nicht gefunden | Rack oder Steckplatznummer falsch. Es ist keine Verbindung zu diesem Steckplatz mehr frei. Im CP Konfiguration prüfen |
-7 | Socketfehler aufgetreten | IPS7GetSockErr aufrufen und Fehler auswerten |
-8 | Speicherfehler | angeforderter Speicher im PC ist nicht verfügbar |
-9 | Bereichsüberschreitung | z.B. Timer > 9990000 ms |
-10 | Gewünschter Datentyp nicht erlaubt oder wird nicht unterstützt | Prüfen, ob der Code für Datentyp in Ordnung ist |
-11 | Der angegebene PC-Datentyp ist den angegebenen SPS- Datenbereich nicht möglich | Das kann z.B. vorkommen, wenn auf Zähler zugegriffen werden soll und der PC-Datenbereich als BYTE angegeben wird. Abhilfe: Datenbereich im PC ändern |
-20 | Der angegebene Speicher im PC ist zu klein (z.B. Array ist zu klein), kann nur bei .net oder PHP auftreten | Datenbereich im PC vergrössern bzw. richtig anpassen |
-21 | Nur .Net!Für diese Instanz der Klasse wurde schon einmal ein Open ausgeführt | Evtl. Close aufrufen |
-31 | Nur bei MultiRead: PC und S7-Datentyp stehen falscher Relation z.B. PC = BYTE SPS = Wort | PC-Datenbereich anpassen |
-32 | Nur bei MultiRead: S7 liefert falsche Anzahl Daten für den angegeben Datentyp | |
-88 | Nur bei MultiRead: Der entsprechende Auftrag wurde noch nicht bearbeitet | |
-99 | Die Referenznummer ist ungültig | Haben Sie IPS7Open aufgerufen? |
4660 | Demozeit ist abgelaufen | Vollversion erwerben |
extern long WINAPI IPS7RdMulti (long Ref, IPS7_RQ_MULTI *pRqList, DWORD Cnt); extern long WINAPI IPS7RdMultiSimplex (long Ref, IPS7_RQ_MULTI *pRqList, DWORD Cnt); // 1.36 extern long WINAPI IPS7RdMultiBuffered (long Ref, IPS7_RQ_MULTI_BUFFERED *pRqList, DWORD Cnt); // 1.40 extern long WINAPI IPS7RdMultiGetData (long Ref, IPS7_RQ_MULTI_BUFFERED *pRq, void *pData); // 1.40 extern long WINAPI IPS7RdMultiCalcPacketCnt (long Ref, IPS7_RQ_MULTI *pRqList, DWORD Cnt);
FUNCTION IPS7RdMulti (Ref : LongInt; pRqList : PIPS7_RQ_MULTI; Cnt : Longword) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdMultiSimplex (Ref : LongInt; pRqList : PIPS7_RQ_MULTI; Cnt : Longword) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdMultiBuffered (Ref : LingInt; pRqList : IPS7_RQ_MULTI_BUFFERED; Cnt : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdMultiGetData (Ref : LongInt; pRq : IPS7_RQ_MULTI_BUFFERED; pData : Pointer) : LongInt; stdcall; external 'IPS7LNK.DLL'; FUNCTION IPS7RdMultiCalcPacketCnt (Ref : LongInt; pRqList : Pointer; Cnt : Longword;) : LongInt; stdcall; external 'IPS7LNK.DLL';
Name | Typ | Beschreibung / Zweck | ||
---|---|---|---|---|
DataArea | 32-Bit unsigned | Die Auswahl des Speicherbereichs in der SPS (DB, Eingang, Ausgang, Merker), welcher bearbeitet werden soll: D = 68 dez. steht für Datenbaustein E = 69 dez. steht für Eingänge A = 65 dez. steht für Ausgänge M = 77 dez. steht für Merker T = 84 dez. steht für Timer (nur mit Doppelwortfunktionen möglich) Die Timer werden in der SPS mit Zeitbasis und Wert im BCD-Format gespeichert. Um dieses Format sofort im PC verarbeiten zu können, führt der Treiber eine automatische Konvertierung in Millisekunden durch. Das kleinst mögliche Raster ist 10 ms. Beim schreiben in die SPS wählt der Treiber automatisch eine passende Zeitbasis. Dabei kann es zu Rundungen kommen. Der Zeitbereich geht von 0 bis 9990000 ms Z = 90 dez. steht für Zähler Auch die Zähler sind in der SPS BCD-Codiert abgelegt. Die Zählerwerte reichen von 0 – 999 |
||
DataType | 32-Bit unsigned | Datentyp in der SPS | ||
Name | Wert | SPS-Datentyp / Bitbreite | ||
IPS7_BIT | 0 | Ein Bit / Boolean | ||
IPS7_BYTE | 1 | Byte (8Bit) | ||
IPS7_WORD | 2 | WORD 16 Bit unsigned integer (ohne Vorzeichen) | ||
IPS7_INT | 3 | INT 16 Bit signed (mit Vorzeichen) | ||
IPS7_DWORD | 4 | DWORD 32 Bit unsigned integer (ohne Vorzeichen) | ||
IPS7_DINT | 5 | long 32 Bit signed integer (mit Vorzeichen) | ||
IPS7_REAL | 6 | S7Real | ||
IPS7_TIMER | 7 | Timer in der S7 | ||
IPS7_COUNTER | 8 | Zähler in der S7 | ||
IPS7_LINT | 9 | INT 64 Bit signed integer (mit Vorzeichen) | ||
IPS7_ULINT | 10 | UINT 64 Bit unsigned integer (ohne Vorzeichen) |
DBNr | 32-Bit unsigned | Datenbausteinnummer, diese wird nur beim Typ 'D' verwendet. Ansonsten steht dort der Wert 0 | ||
Cnt | 32-Bit unsigned | Anzahl der Datenelemente, die gelesen/geschrieben werden sollen | ||
Start | 32-Bit unsigned | Startbyte in der SPS | ||
StartBit | 32-bit unsigned | Die Nummer des ersten Bits in der SPS, Werte (0 – 7), wird nur bei Bit-Zugriffen verwendet, ansonsten 0 | ||
PCDataType | 32-Bit unsigned | Datentyp im PC | ||
Name | Wert | Datentyp in der SPS | ||
---|---|---|---|---|
PC_BYTE | 0 | Byte (8 Bit) | ||
PC_WORD16 | 1 | 16 Bit unsigned integer | ||
PC_INT16 | 2 | 16 Bit signed integer | ||
PC_WORD32 | 3 | 32 Bit unsigned integer | ||
PC_INT32 | 4 | 32 Bit signed integer | ||
PC_FLOAT | 5 | 32 Bit Fließpunktzahl im PC (float) | ||
PC_DOUBLE | 6 | 64 Bit Fließpunktzahl im PC (double) | ||
PC_WORD64 | 7 | 64 Bit unsigned integer | ||
PC_INT64 | 8 | 64 Bit signed integer | ||
Result | 32-Bit unsigned | Ergebnis für diesen Auftrag. Die einzelnen Werte finden Sie weiter unten bei der Beschreibung: Return-Wert für Read/Writefunktionen | ||
UserData_0 | 32-Bit unsigned | Dieser Eintrag kann vom Aufrufer verwendet werden, um eigene Informationen aufzurufen. Der Wert wird vom Treiber weder ausgewertet noch verändert. Damit könnten z.B. Zusatzinformationen über die Eigenschaften der Variable im PC abgelegt werden | ||
UserData_1 | 32-Bit unsigned |
|||
Data | 32-Bit Pointer | Der eigentliche Zeiger auf den Speicherbereich im PC für diesen Auftrag | ||
pUserData | 32-Bit Pointer | wie UserData_0 und UserData_1, jedoch als Pointer |
// kleine Funktion zur Initialiesierung eines einzelnen Requests void InitRq (IPS7_RQ_MULTI *pRq, long DataArea, long DataType, long PcDataArea, long DBNr, long Start, long StartBit, long Cnt, void *pData) { pRq->DataArea = DataArea; pRq->DataType = DataType; pRq->DBNr = DBNr; pRq->Cnt = Cnt; pRq->Start = Start; pRq->StartBit = StartBit; pRq->PcDataType = PcDataArea; pRq->Data = pData; } void DemoRdMulti (int Ref) { int EBits[64]; BYTE EBytes[64]; WORD MWords[32]; WORD DB10Words [150]; double DB10WordsAsDouble [150]; float DB20RealAsFloat [60]; LONG32 TimerAsInt [10]; int Cnt = 10; int Res; IPS7_RQ_MULTI Rq[10] ; // Max. 10 Aufträge; memset (Rq, 0, sizeof (Rq)); Cnt = 0; // lese ab E 4.0 32 Bit InitRq (&Rq[Cnt++], ‘E’, IPS7_BIT, PC_BYTE, 0, 4, 0, 32, EBits); // lese ab EB0 20 Byte und lege diese ab [20] ab InitRq (&Rq[Cnt++], ‘E’, IPS7_BYTE, PC_BYTE, 0, 0, 0, 20, &EBytes[20]); //lese ab MB 20 10 Worte InitRq (&Rq[Cnt++], ‘M’, IPS7_WORD, PC_WORD16, 0, 20, 0, 1, MWords); //lese DB10 ab Datenbyte 0 150 Worte InitRq (&Rq[Cnt++], ‘D’, IPS7_WORD, PC_WORD16, 10, 0, 0, 150, DB10Words); //lese DB20 ab Datenbyte 0 150 Worte lege diese aber als double im PC ab InitRq (&Rq[Cnt++], ‘D’, IPS7_WORD, PC_DOUBLE, 10, 0, 0, 150, DB10WordsAsDouble); //lese DB20 ab Datenbyte 6 60 Realwerte und lege diese als Floatwerte im PC ab InitRq (&Rq[Cnt++], ‘D’, IPS7_REAL, PC_FLOAT, 10, 6, 0, 60, DB20RealAsFloat); //lese ab Timer 5 10 Timer und lege diese als int ab InitRq (&Rq[Cnt++], ‘T’, IPS7_TIMER, PC_WORD32, 0, 5, 0, 10, TimerAsInt); // T5 10 Timer Res = IPS7RdMulti(Ref, Rq, Cnt); for (int i = 0; i < Cnt; i++) { if (Rq[i].Result == 0) // alles in Ordnung { //.. Daten auswerten und verarbeiten } else { // Fehler auswerten } } } }
Name | Name (PHP) | Beschreibung/Zweck |
---|---|---|
IPS7ReadDiagBuffer | Auslesen des Diagnosebuffers |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | S7_EVENTENTRY Pointer | mixed | pEvent | Pointer auf die Struktur des Events, siehe oben. Daten werden größenmäßig aneinander gereit geschrieben (16-Bit Word, 8-Bit Priority …) |
3 | 32-Bit | MaxEvents | Anzahl der maximal auszulesenden Events | |
4 | 32-Bit | pRxEventCnt | Pointer auf die tatsächliche Anzahl ausgelesener Events |
typedef struct {
BYTE Year; BYTE Month; BYTE Day; BYTE Hour; BYTE Minute; BYTE Second; BYTE Centisecond; BYTE Millisecond;
} S7_TIMESTAMP;
typedef struct {
WORD EventId; BYTE Priority; BYTE OBNr; BYTE Reserved[2]; BYTE Info1[2]; BYTE Info2[4]; S7_TIMESTAMP Time; const char *Text;
} S7_EVENTENTRY;
extern long WINAPI IPS7ReadDiagBuffer(long Ref, S7_EVENTENTRY *pEvent, int MaxEvents, int *pRxEventCnt); </code>
FUNCTION IPS7ReadDiagBuffer (Ref : LongInt; pEvent : Pointer; MaxEvents : Int; pRxEventCnt : Pointer;) : LongInt; stdcall; external 'IPS7LNK.DLL';
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7GetPLCTime | ips7_getplctime | Liest die Systemzeit der SPS |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-Bit Pointer auf 32 Bit Wert | long | Year | Pointer auf den 32 Bit Wert für das Jahr (nach lesen steht dort z.B. 2012) |
2 | 32-Bit Pointer auf 32 Bit Wert | long | Month | Pointer auf den 32 Bit Wert für das Monat (1-12) |
2 | 32-Bit Pointer auf 32 Bit Wert | long | Day | Pointer auf den 32 Bit Wert für den Tag (1 -31) |
2 | 32-Bit Pointer auf 32 Bit Wert | long | Hour | Pointer auf den 32 Bit Wert für die Stunde (0 – 23) |
2 | 32-Bit Pointer auf 32 Bit Wert | long | Min | Pointer auf den 32 Bit Wert für die Minuten (0 – 59) |
2 | 32-Bit Pointer auf 32 Bit Wert | long | Sec | Pointer auf den 32 Bit Wert für die Sekunden (0-59) |
2 | 32-Bit Pointer auf 32 Bit Wert | long | Ms | Pointer auf den 32 Bit Wert für die Millisekunden ( 0-999) |
extern long WINAPI IPS7GetPLCTime (long Ref, long *pYear, long *pMonth, long *pDay, long *pHour, long *pMin, long *pSec, long *pMs); // 1.54
{ -- Version 1.54 --} FUNCTION IPS7GetPLCTime (Ref : LongInt; pYear : PLongInt; pMonth : PLongInt; pDay : PLongInt; pHour : PLongInt; pMin : PLongInt; pSec : PLongInt; pMs : PLongInt) : LongInt; stdcall; external 'IPS7LNK.DLL';
Es gelten dieselben Return-Werte wie für die Lese/Schreibfunktionen!
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7SetPLCTime | ips7_setplctime | Setzte die Systemzeit der SPS |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit Wert | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-Bit Wert | long | Year | 32 Bit Wert für das Jahr (1999 – 21xx) |
2 | 32-Bit Wert | long | Month | 32 Bit Wert für das Monat (1-12) |
2 | 32-Bit Wert | long | Day | 32 Bit Wert für den Tag (1 -31) |
2 | 32-Bit Wert | long | Hour | 32 Bit Wert für die Stunde (0 – 23) |
2 | 32-Bit Wert | long | Min | 32 Bit Wert für die Minuten (0 – 59) |
2 | 32-Bit Wert | long | Sec | 32 Bit Wert für die Sekunden (0-59) |
2 | 32-Bit Wert | long | Ms | 32 Bit Wert für die Millisekunden ( 0-999) |
long WINAPI IPS7SetPLCTime (long Ref, long Year, long Month, long Day, long Hour, long Min, long Sec, long Ms); // 1.54
{ -- Version 1.54 --} FUNCTION IPS7SetPLCTime (Ref : LongInt; Year : LongInt; Month : LongInt; Day : LongInt; Hour : LongInt; Min : LongInt; Sec : LongInt; Ms : LongInt) : LongInt; stdcall; external 'IPS7LNK.DLL';
Es gelten dieselben Return-Werte wie für die Lese/Schreibfunktionen!
In der SPS stehen verschiedene Systeminformationen zur Verfügung. Die meisten jedoch erst ab FW 2.2 der S7. Folgende Informationen können in einem String empfangen werden.
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7GetPLCName | ips7_getplcname | Liest den Namen der SPS |
IPS7GetModuleName | ips7_getmodulename | Liest den Namen der Baugruppe (z.B CPU 315-2 DP/PN - Test) |
IPS7GetPlantIdName | ips7_getplantidname | Liest den Anlagenamen der SPS |
IPS7GetCopyrightEntry | ips7_getcopyrightentry | Liest den Copyright Eintrag der SPS |
IPS7GetModuleSNr | ips7_getmodulesnr | Liest die Seriennummer der SPS |
IPS7GetModuleTypeName | ips7_getmoduletypename | Liest den Baugruppentyp der SPS (z.B CPU 315-2 DP/PN) |
IPS7GetMMCSNr | ips7_getmmcsnr | Liest die Seriennummer der MMC |
IPS7GetLocationDesignation | ips7_getlocationdesignation | Liest die Ortsbeschreibung in der SPS |
IPS7GetOEMId | ips7_getoemid | Liest die OEM-ID der CPU |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-Bit Pointer auf C-String | string | strInfo | Pointer auf den String, der die Info erhalten soll. Muss mindestens 64 Zeichen aufnehmen können |
extern long WINAPI IPS7GetPLCName(long Ref, char *Str); extern long WINAPI IPS7GetModuleName(long Ref, char *Str); // 1.55 extern long WINAPI IPS7GetPlantIdName(long Ref, char *Str); // 1.55 extern long WINAPI IPS7GetCopyrightEntry(long Ref, char *Str); // 1.55 extern long WINAPI IPS7GetModuleSNr(long Ref, char *Str); // 1.55 extern long WINAPI IPS7GetModuleTypeName(long Ref, char *Str); // 1.55 extern long WINAPI IPS7GetMMCSNr(long Ref, char *Str); // 1.55 extern long WINAPI IPS7GetOEMId(long Ref, char *Str); // 1.55 extern long WINAPI IPS7GetLocationDesignation (long Ref, char *Str); // 1.55
{ -- Version 1.55--} FUNCTION IPS7GetPLCName(Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} FUNCTION IPS7GetModuleName(Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} FUNCTION IPS7GetPlantIdName(Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} FUNCTION IPS7GetCopyrightEntry(Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} IPS7GetModuleSNr(Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} FUNCTION IPS7GetModuleTypeName(Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} FUNCTION IPS7GetMMCSNr(Ref : LongInt; Str : PAnsiCHar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} FUNCTION IPS7GetOEMId(Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL'; { -- Version 1.55 --} FUNCTION IPS7GetLocationDesignation (Ref : LongInt; Str : PAnsiChar) : LongInt; stdcall; external 'IPS7LNK.DLL';
Es gelten die selben Return-Werte wie für die Lese/Schreibfunktionen!
Ab Version 1.78
Name | Name (PHP) | Beschreibung / Zweck |
---|---|---|
IPS7GetDBLen | Liest die Datenbausteinlänge der übergebenen Datenbausteinnummer aus. |
Nr | Datentyp | Datentyp (PHP) | Name | Funktion |
---|---|---|---|---|
1 | 32-Bit unsigned | long | Ref | Die Referenz der Verbindung, welche mit IPS7Open generiert wurde. Dient zur internen Identifikation der Verbindung |
2 | 32-Bit unsingend | long | DBNr | gewünschte Datenbausteinnummer |
extern long WINAPI IPS7GetDBLen(long Ref, unsigned long DBNr);
FUNCTION IPS7GetDBLen(Ref : LongInt, DBNr : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
Wert | Fehlerbeschreibung | Bedeutung/Reaktion |
---|---|---|
> 0 | ausgelesene Datenbausteinlänge | |
-35 | Datenbaustein existiert nicht | Datenbausteinnummer prüfen |
-36 | Funktion wird nicht von der SPS unterstützt | |
Es gelten die selben Return-Werte wie für die Lese/Schreibfunktionen! |
unsigned char ByteBuffer[512]; unsigned short int WordBuffer[512]; //Aufruf der Bytefunktion z.B. Lese DB 10, ab DW0, 10 Worte IPS7RdW (Ref,'D',10, 0, 10, WordBuffer); //Aufruf der Bytefunktion z.B. Lese MB 0 , 10 Bytes IPS7RdB (Ref,'M' ,0, 0, 10, ByteBuffer);
Nach erfolgreichem Aufruf gilt:
PC | = | SPS |
---|---|---|
WordBuffer[0] | = | DB10.DBW0 |
WordBuffer[1] | = | DB10.DBW2 |
WordBuffer[2] | = | DW10.DBW4 |
ByteBuffer[0] | = | MB 0 |
ByteBuffer[1] | = | MB 1 |
ByteBuffer array [0..511] of Byte; WordBuffer array [0..511] of Word; //Aufruf der Wortfunktion z.B. Lese DB 10, ab DW0, 10 Worte IPS7RdW (Ref, LongWord ('D'), 10, 0, 10, @WordBuffer[0]); //Aufruf der Bytefunktion z.B. Lese MB 0 , 10 Bytes IPS7RdB (Ref,'M' ,0, 0, 10, @ByteBuffer[0]);
Dim ByteBuffer (0 to 511) as Byte; Dim WordBuffer (0..511) as Word; //Aufruf der Wortfunktion z.B. Lese DB 10, ab DW0, 10 Worte IPS7RdW (Ref, 68, 10, 0, 10, WordBuffer(0)) //Aufruf der Bytefunktion z.B. Lese MB 0 , 10 Bytes IPS7RdB (Ref, 77, 0, 0, 10, ByteBuffer(0));
Nach erfolgreichem Aufruf gilt:
PC | = | SPS |
---|---|---|
WordBuffer[0] | = | DB10.DBW0 |
WordBuffer[1] | = | DB10.DBW2 |
WordBuffer[2] | = | DW10.DBW4 |
ByteBuffer[0] | = | MB 0 |
ByteBuffer[1] | = | MB 1 |
Version 1.78.00 04.10.2018
Version 1.77.00 12.12.17
Version 1.76.00 20.5.17
Version 1.75.00 11.10.16
Version 1.74.00 6.7.15
Version 1.73 vom 16.6.15
Version 1.72.93 vom 25.3.15
Version 1.71.92 vom 8.12.14
Version 1.71.92 vom 8.12.14
Version 1.70.91. vom 2.7.14
Version 1.69.90 vom 04.06.14
Version 1.68.89 vom 09.05.14
Version 1.67.88 vom 29.04.14
Version 1.66.87 vom 04.04.14
Version 1.65.86 vom 31.03.14
Version 1.64 vom 04.12.13
Version 1.63
Version 1.62.83 vom 09.09.13
Version 1.62.82 vom 08.07.2013
Version 1.61.80 vom 19.06.2013
Version 1.60.78 vom 02.04.2013
Version 1.58 vom 17.07.12
Version 1.57
Version 1.56 vom 21.05.12
Version 1.55 vom 12.04.12
neue Funktionen:
Version 1.54 vom 05.04.12
Version 1.53 vom 22.02.12
Version 1.52 vom 30.01.12
Version 1.51 vom 30.11.11
bei 1.50 MultiRead Fehler (PDUSize)
Version 1.50 vom 25.11.11
Version 1.49 vom 11/11
Version 1.48 29.11.10
Version 1.47 vom 24.09.10
Version 1.46 vom 08.09.10
Version 1.45 vom 07.09.10
Version 1.44 vom 18.08.10
Version 1.43 vom 22.07.10
Version 1.42 vom 14.07.10
Version 1.41 vom 13.07.10
Version 1.40 vom 07.07.10
Version 1.39 vom 17.06.10
Version 1.38 vom 24.05.10
Version 1.37 vom 18.05.10
Version 1.36 vom 03.05.10
Version 1.35 vom 14.04.10
Neu Funktionen:
Version 1.34 vom 02/10
Version 1.33 vom 02.02.10
Version 1.32 vom 27.08.09
Version 1.31 vom 20.08.09
Version 1.30 vom 17.07.09
Version 1.29 vom 20.04.09
Version 1.28 vom 09.02.09
Version 1.27 vom 26.08.08
Version 1.26 vom 12.08.08
Version 1.25 vom 16.07.08
Beim Aufruf von IPS7Open mit mehreren Threads gleichzeitig kam es gelegentlich zu Traps. Problem mit CriticalSection behoben
Version 1.24 vom 10.07.08
Version 1.23 vom 02.06.06
Version 1.22 vom 14.10.05
Version 1.21 vom 04.08.05
Version 1.20 vom 08.07.05
Version 1.19 vom 20.05.05
Version 1.18 vom 17.05.05
Version 1.17 vom 04.03.05
Version 1.16 vom 01.12.04
Version 1.15 vom 11.11.04
Version 1.14 vom 01.08.04
Version 1.13 vom 26.07.04
Version 1.12 vom 07.07.04
Version 1.11 vom 13.05.04
Version 1.10 vom 13.05.04
Version 1.09 vom 19.03.04
Version 1.08 vom 23.01.02
Version 1.07 vom 12.12.01
Version 1.06 vom 19.09.01
Version 1.05 vom 12.07.01
Version 1.04 vom 19.06.01
Version 1.03 vom 17.05.01
Version 1.02 vom 29.01.01
Version 1.01 vom 21.12.00
Version 1.00 vom 14.12.00