S7-Web-LINK provides data from an SPS using a Json Rest API
{ "WebServerSettings": { "Port": 8080, "UseHTTPS": true, // Wheter SLL (HTTPS) should be used or not "Certificate": "S7-Web-LINK.pem" // Path to certificate file }, "Connections": { "SPS-1": { // Predefined connection see chapter "Request -> Connection" "IPAddr": "127.0.0.1", "PlcType": "s7_300_400", "Channel": "op", "Rack": 0, "Slot": 2, "RxTimeout": 5000, "TxTimeout": 5000, "ConTimeout": 5000 } }, "TokenList": { // SPS with the IP "127.0.0.1" could be accessed using "Auth": "password" "127.0.0.1": "password", "192.168.2.123": "secret", "192.168.0.80": "123456" } }
-----BEGIN CERTIFICATE----- MIICWDCCAcGgAwIBAgIJAIfbmjDRjQcwMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV BAYTAkRFMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQwHhcNMTYwMjIyMTIyNjMxWhcNMTcwMjIxMTIyNjMxWjBF MQswCQYDVQQGEwJERTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB gQC/u0VOmGadfg7WsGSDi8SxBl+KCALRw24DHFotnsiSBAp1st+TNd8wzrpjAsLb 1f1ZnmN2/PthSGzorhMGJC4iMXcDk1TmDLgDuoTovq8dJ/vqXcHaEr+T59vJAn+s NR2tR7PlARykWTCO0qizcigW1ICIyEmYkuQokeZsHAaqWQIDAQABo1AwTjAdBgNV HQ4EFgQUVVSEEuEv+mAbb/C4wEZYjxbucbMwHwYDVR0jBBgwFoAUVVSEEuEv+mAb b/C4wEZYjxbucbMwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQCw+IaN GMYDwonsMstcXs5DC9lqvVGBnBPF3biF76q/MsKy+zytFmFsPsqlV/OMRLstTC+0 WDIB6WaoHpBrzJopxVOZQQczbdqWfUcpI++6Q8o6peBtzyAqa5IAygfia3yMOI7R laxVSfbEqEzPVow8QcaiewLWqEFGBOlsIVDv8w== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQC/u0VOmGadfg7WsGSDi8SxBl+KCALRw24DHFotnsiSBAp1st+T Nd8wzrpjAsLb1f1ZnmN2/PthSGzorhMGJC4iMXcDk1TmDLgDuoTovq8dJ/vqXcHa Er+T59vJAn+sNR2tR7PlARykWTCO0qizcigW1ICIyEmYkuQokeZsHAaqWQIDAQAB AoGAQvK9TKhijHPL8qM9NcHEOJwlGCmb8mrvKx7nTi63kmTe0iJXdyvEd2J4KsJ4 EBM0l+p6iL3leR61CLpf4jEX+jUNJgFgduwLpXMeq/jaNAxNRRsiDEnmFqIMZGYX R+9/e2dTlJFAe/VAOuMxylLUVqWKQpI/3eaQRo0GkRUMYAECQQD1UCvntG0D7e1u ksh8QUwY4A28FvLbiCxYK0jpw15iKDz/DlwhrfZB8I5EgVQMWXJWcGUWSzbEvqRr 4P+6SakBAkEAyBWJJ7qDL7DgqIbgaQWLicqhKF3mO1nxj5DtEtUdu/cP0liGiV8M tlMyf/YWuI9l3qmfMUXXjaQjkavFTJnpWQJAP/wnV4piHPJESeETVgWaGarnKjY6 JjTAjEbN/9srlSK1tjlCoq5DWzOpiAjLqWTzQ8SROV1o7axkKpdHXIm2AQJAatCs bwwwOsaXuQCATzDJpJ8LWAyA+9BxmC5LkhE6FX248ZeXA0E9/Rv/SrbqvE65mJw/ Q0PA5nnpDzx/UPydyQJBAMH3ZdrdxwF2rvdXtjNYq1NkG2N783Uok6WQ55mDiBhn sBd9qHiTnGsjZHFJasb01y5w87ZxE6aDdvMO0XCdKOY= -----END RSA PRIVATE KEY-----
Install OpenSSL for Debian or Ubuntu based distribute:
sudo apt-get install openssl
Install on other linux distribution
openssl genrsa -out server.key 1024 openssl req -days 365 -out server.pem -new -x509 -key server.key cat server.pem >> S7-Web-LINK.pem cat server.key > S7-Web-LINK.pem
This will read a value from our SPS using JavaScript
<?php // The data to send to the API $postData = array( "Auth" => "password", "Connection" => array( "IPAddr" => "127.0.0.1" ), "Read" => array( array( "Addr" => "DB1000.DBB 304", "Type" => "string", "Length" => 10 ), array( "Addr" => "DB1000.DBX 322.0", "Type" => "byte" ) ) ); // Setup cURL $ch = curl_init("https://127.0.0.1"); curl_setopt_array($ch, array( CURLOPT_POST => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_HTTPHEADER => array( 'Content-Type: application/json' ), CURLOPT_POSTFIELDS => json_encode($postData) )); // Send the request $response = curl_exec($ch); // Check for errors if($response === FALSE){ die(curl_error($ch)); } // Decode the response $responseData = json_decode($response, TRUE); // Print the date from the response var_dump($responseData); ?>
<?php // The data to send to the API $postData = ... // Create the context for the request $context = stream_context_create(array( "http" => array( // http://www.php.net/manual/en/context.http.php "method" => "POST", "header" => "Content-Type: application/json\r\n", "content" => json_encode($postData) ) )); // Send the request $response = file_get_contents("https://127.0.0.1", FALSE, $context); // Check for errors if($response === FALSE){ $error = error_get_last(); var_dump($error); die(); } echo $response . "<br />"; // Decode the response $responseData = json_decode($response, TRUE); // Print the date from the response var_dump($responseData); ?>
{ "Auth": "password", // Password or Token "Connection": "SPS-1", // Name predefined in the configuration file "Read": [ ... ], // optional "Write": [ ... ] // optional }
{ "Auth": "password", // Password or Token "Connection": { "IPAddr": "127.0.0.1", "PlcType": "s7_300_400", // optional, could be set to "s7_300_400" (default), "s7_1200", "s7_1500", "s7_200", "s7_logo" "Channel": "op" // optional, could be set to "op" or "pg" "Rack": 0, // optional "Slot": 2, // optional "RxTimeout": 5000, // optional, default 5000 "TxTimeout": 5000, // optional, default 5000 "ConTimeout": 5000 // optional, default 5000 }, "Read": [ ... ], // optional "Write": [ ... ] // optional }
{ "Auth": "password", "Connection": { ... }, "Read": [{ "Addr": "DB1000.DBB 304", "Type": "string", "Length": 10 }, { "Addr": "DB1000.DBX 322.0", "Type": "byte" }] }
{ "Auth": "password", "Connection": { ... }, "Write": [{ "Addr": "DB1000.DBB 304", "Type": "string", "Value": "HelloWorld" }, { "Addr": "DB1000.DBD 300", "Type": "double", "Value": 13.7 }] }
Name | Bit |
---|---|
byte | 8 (unsigned) |
word | 32 (unsigned) |
word16 | 16 (unsigned) |
word32 | 32 (unsigned) |
word64 | 64 (unsigned) |
int | 32 (signed) |
int16 | 16 (signed) |
int32 | 32 (signed) |
int64 | 64 (signed) |
float | 32 (signed) |
double | 64 (signed) |
string |
{ "Connection": { "PlcType": ..., // echo (same as request) "Channel": ... // echo (same as request) "IPAddr": ..., // echo (same as request) "Rack": ..., // echo (same as request) "Slot": ..., // echo (same as request) "RxTimeout": ..., // echo (same as request) "TxTimeout": ..., // echo (same as request) "ConTimeout": ..., // echo (same as request) "Result": { "Value": -2, // default 0 "Message": "The maximum number (256) of the possible connections is reached!" // default "OK" } }, "Read": [ ... ], // optional "Write": [ ... ] // optional }
{ "Connection": { ... }, "Read": [{ "Addr": "DB1000.DBB 304", // echo (same as request) "Type": "string", // echo (same as request) "Length": 10, // echo (same as request) "Value": "HelloWorld", "Result": { "Value": 0, // default 0 "Message": "OK" // default "OK" } }, { "Addr": "DB1000.DBX 322.0", // echo (same as request) "Type": "byte", // echo (same as request) "Value": null, // if read failed value will be null "Result": { "Value": -1, // default 0 "Message": "Desired data type is not allowed or is not supported." // default "OK" } }] }
{ "Connection": { ... }, "Write": [{ "Addr": "DB1000.DBB 304", // echo (same as request) "Type": "string", // echo (same as request) "Value": "HelloWorld", // echo (same as request) "Result": { "Value": 0, // default 0 "Message": "OK" // default "OK" } }, { "Addr": "DB1000.DBD 300", // echo (same as request) "Type": "double", // echo (same as request) "Value": 13.7, // echo (same as request) "Result": { "Value": 0, // default 0 "Message": "OK" // default "OK" } }] }
Value | Message | Description (Reaction) |
---|---|---|
0 | OK | Default Everything okay |
-1 | Timeout, PLC not reachable. | Start further read/write operations. The driver automatically repairs the connection. May you hav to increase the timeout values (receive/connect timeout). |
-2 | The maximum number (256) of the possible connections is reached. | Close unused connections |
-5 | General error. | Check whether network is properly installed in the PC: TCP / IP enabled? Winsocket installed? |
-6 | Target CPU not found. | Rack or number of slot invalid.No connection to these slot available. Check configuration in CP and PLC |
-7 | Socket error | "Result": { "Value": -7, "Message": "Socket error", "SocketError": { "Value": 10013, "Message": "Permission denied." } } |
-8 | Memory error | Requested memory in the PC is not available. |
-9 | Overrange | e.g.. timer > 9990000 ms |
-10 | Desired data type is not allowed or is not supported. | Check that the code for data type is valid. |
-11 | The specified PC data type do not correspond to the specified PLC data area. | e.g : This can occur if you want to access counter and the PC is specified as data type BYTE. Solution: Change the data type in the PC. |
-31 | PC and S7 data type are in invalid relation e.g. PC = BYTE = Word PLC | Adjust PC – data area. |
-32 | S7 returns incorrect number of data for the specified data type. | |
-33 | Consecutively access to multiple bits not available. | |
-34 | The requested request block could not be assigned. | |
-1002 | No resource available. | Maximum of the available connections is reached. |
2 | Block or data area does not exist, for example access to DB, which is not available, or too small. | Verify that the desired data area exists in the PLC. |