When watching (tail -f) log files sometimes I do not want to see line breaks just because the log line is too long. The following command should disable line wrapping in a gnome-terminal:
> tput rmam
When watching (tail -f) log files sometimes I do not want to see line breaks just because the log line is too long. The following command should disable line wrapping in a gnome-terminal:
> tput rmam
Visual C++ 2010 Redistributables
F:\Setup\SDKSetup.exe
Start
> Microsoft Windows SDK v7.1
> Windows SDK 7.1 Command Prompt
c:\app\graalvm-ce-19.2.1\bin\native-image -jar Example.jar ^
--no-fallback ^
--report-unsupported-elements-at-runtime ^
--allow-incomplete-classpath ^
If you need to add a reverse proxy to your Internet Information Server (IIS) you can just add a rule to your site configuration file. In the following example we add a reverse proxy (url rewrite) for a GraphQL Server to our WinCC Unified WebRH. Afterwards restart the site with the IIS services manager.
IIS Configuration File:
"C:\Program Files\Siemens\Automation\WinCCUnified\SimaticUA\web.config"
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<rule name="Remove Server header">
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
<rules>
<rule name="Reverse Proxy to GraphQL" stopProcessing="true">
<match url="^graphql" />
<action type="Rewrite" url="http://localhost:4000/graphql" />
</rule>
<rule name="UMC SSO Static">
<match url="(.*)" />
<conditions>
<add input="{URL}" pattern="(.*)\/umc-sso(.*)" />
</conditions>
<serverVariables>
<set name="HTTP_COOKIE" value="{HTTP_COOKIE};ReverseProxyHost={HTTP_HOST};ReverseProxyPort={SERVER_PORT}" />
</serverVariables>
<action type="Rewrite" url="http://localhost:8443/umc-sso{C:2}" />
</rule>
</rules>
</rewrite>
...
More examples for rewrite rules
<rewrite>
<rules>
<rule name="Reverse Proxy to webmail" stopProcessing="true">
<match url="^webmail/(.*)" />
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
</rule>
<rule name="Reverse Proxy to payroll" stopProcessing="true">
<match url="^payroll/(.*)" />
<action type="Rewrite" url="http://localhost:8082/{R:1}" />
</rule>
</rules>
</rewrite>
Restart site with “Internet Information Services (IIS) Manager”
For testing sometimes it is too hard to deal with security :-). To make the OPC UA server in WinCC OA unsecure add the following lines to the config file.
[opcuasrv]
disableSecurity = 1
enableAnonymous = 1
Add the WCCOAopcuasrv manager to the project and start it.
To publish datapoints don’t forget to add the datapoints to the DP groups “OPCUARead” and “OPCUAWrite”.
PostgreSQL table with ts+key as primary key: ~43GB
PostgreSQL wide column table with ts as primary key : 247GB
Cassandra wide column table with ts as primary key: 4.5GB
Strange that in PostgreSQL a table with much less rows (but much more columns) needs a lot of more space (both tables store the same amount of data). )
It seems that the Apache Cassandra Column Store can compress the columns pretty good – factor 10 less disk space!
The source table in PostgreSQL (TimescaleDB) with a timestamp and a key column and 8 data columns had about 170 Mio rows.
CREATE TABLE candles ( instrument character varying(10) NOT NULL, ts timestamp(3) without time zone NOT NULL, o numeric, h numeric, l numeric, c numeric, primary key (instrument, ts) )
I needed to flatten the table so that i have just the timestamp as primary key and many columns and each column is of a type. It ends up in a table with about 1.6 Mio rows and many columns.
CREATE TYPE price AS ( o float, c float, h float, l float, volume float ); CREATE TABLE candles_wide ( ts timestamp(3) without time zone NOT NULL, AU200_AUD price, AUD_CAD price, AUD_CHF price, AUD_HKD price, AUD_JPY price, AUD_NZD price, ... 124 columns
Apache Cassandra wide column store table with ts as primary key and many columns.
CREATE TABLE candles (ts timestamp, AU200_AUD tuple<float,float,float,float,float>, AUD_CAD tuple<float,float,float,float,float>, AUD_CHF tuple<float,float,float,float,float>, ... 124 tuples
Connected Python to WinCC OA through a Websocket Manager. Python programs can connect to WinCC OA and read/write datapoints. Communication is JSON based, it’s simple to use in Python, see examples below (ws://rocworks.no-ip.org can be used for tests, but will not be available all the time).
https://github.com/vogler75/oa4j-wss
Required Python modules:
############################################################ # Open Connection ############################################################ import json import ssl from websocket import create_connection url='ws://rocworks.no-ip.org/winccoa?username=demo&password=demo' ws = create_connection(url, sslopt={"cert_reqs": ssl.CERT_NONE}) ############################################################ # dpGetPeriod ############################################################ cmd={'DpGetPeriod': { 'Dps':['ExampleDP_Trend1.'], 'T1': '2018-02-07T18:10:00.000', 'T2': '2018-02-07T23:59:59.999', 'Count': 0, # Optional (Default=0) 'Ts': 0 # Optional (0...no ts in result, 1...ts as ms since epoch, 2...ts as ISO8601) }} ws.send(json.dumps(cmd)) res=json.loads(ws.recv()) #print(res) if "System1:ExampleDP_Trend1.:_offline.._value" in res["DpGetPeriodResult"]["Values"]: values=res["DpGetPeriodResult"]["Values"]["System1:ExampleDP_Trend1.:_offline.._value"] print(values) else: print("no data found") # Plot result of dpGetPeriod %matplotlib inline import matplotlib.pyplot as plt plt.plot(values) plt.ylabel('ExampleDP_Trend1.') plt.show() ############################################################ # dpGet ############################################################ cmd={'DpGet': {'Dps':['ExampleDP_Trend1.', 'ExampleDP_Trend2.']}} ws.send(json.dumps(cmd)) res=json.loads(ws.recv()) print(json.dumps(res, indent=4, sort_keys=True)) ############################################################ # dpSet ############################################################ from random import randint cmd={'DpSet': {'Wait': True, 'Values':[{'Dp':'ExampleDP_Trend1.','Value': randint(0, 9)}, {'Dp':'ExampleDP_Trend2.','Value': randint(0, 9)}]}} ws.send(json.dumps(cmd)) res=json.loads(ws.recv()) print(json.dumps(res, indent=4, sort_keys=True)) ############################################################ # dpConnect ############################################################ from threading import Thread def read(): while True: res=json.loads(ws.recv()) print(res) Thread(target=read).start() cmd={"DpConnect": {"Id": 1, "Dps": ["ExampleDP_Trend1."]}} ws.send(json.dumps(cmd))
To learn how deep learning works I decided to implement a Multilayer Neural Network with Backpropagation by my own in Clojure (I did NOT use a library like Tensor Flow or Deeplearning4j). The link between Clojure and the SCADA system WinCC OA is oa4j. With that connection the Neural Network can be used and trained with sensor data collected by the SCADA system …
Because Clojure is a JVM language, oa4j can be used to connect to WinCC Open Architecture.
(def manager (new JManager)) (defn callback [values] (let [v (reduce #(+ %1 %2) (map #(.getValueObject %) values))]; (dpSet :ExampleDP_Trend1. v))) (defn -main [& args] (.init manager (into-array args)) (.start manager) (dpSet {:ExampleDP_Arg1. 2.0 :ExampleDP_Arg2. 3.0}) (println (clojure.string/join "," (dpGet [:ExampleDP_Arg1. :ExampleDP_Arg2.]))) (let [c (dpConnect [:ExampleDP_Arg1. :ExampleDP_Arg2.] callback)] (Thread/sleep 180000) (.disconnect c)) (.stop manager))
Full example can be found here.
Here you will find Dockerfiles for WinCC OA: https://github.com/vogler75/winccoa-images