Siemens LOGO! 0BA7 auslesen
WICHTIG: Vorher in Parameter VM Zuordnung die im DB gewünschten Werte festlegen
WICHTIG: Netzwerkverbindung mit TSAP 01.00 und mit Operator Panel [x] konfigurieren
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace LOGO_Remote { public partial class Form1 : Form { static libnodave.daveOSserialType fds; static libnodave.daveInterface di; static libnodave.daveConnection dc; string ip = "192.168.1.111"; // Siemens LOGO! 0BA7 int port = 102; // Siemens LOGO! 0BA7 int protokoll = libnodave.daveProtoISOTCP; static int mpi = 0; // MPI static int rack = 1; // Racknummer static int slot = 0; // Slotnummer int res; int LOGODInputs = 0; int LOGODOutputs = 0; int LOGOAInputs = 0; int LOGOAOutputs = 0; int LOGODB = 0; int LOGOFlags = 0; public Form1() { InitializeComponent(); } public static bool CheckBitSet(byte b, int BitNumber) { //Kleine Fehlerbehandlung if (BitNumber < 8 && BitNumber > -1) { return (b & (1 << BitNumber)) > 0; } else { throw new InvalidOperationException( "Der Wert für BitNumber " + BitNumber.ToString() + " war nicht im zulässigen Bereich! (BitNumber = (min)0 - (max)7)"); } } public void connectlogo() { fds.rfd = libnodave.openSocket(port, ip); fds.wfd = fds.rfd; if (fds.rfd > 0) { di = new libnodave.daveInterface(fds, "IF1", 0, protokoll, libnodave.daveSpeed187k); di.setTimeout(1000000); dc = new libnodave.daveConnection(di, mpi, rack, slot); dc.connectPLC(); } else Console.WriteLine("Connect Error"); } public void disconnectlogo() { dc.disconnectPLC(); libnodave.closeSocket(fds.rfd); } public void readlogodi() { // Digitale Eingänge lesen res = dc.readBytes(libnodave.daveInputs, 0, 0, 1, null); if (res == 0) { LOGODInputs = dc.getU8(); } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } public void readlogodo() { // Digitale Eingänge lesen res = dc.readBytes(libnodave.daveOutputs, 0, 0, 1, null); if (res == 0) { LOGODOutputs = dc.getU8(); } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } public void readlogoai() { // Analoge Eingänge lesen res = dc.readBytes(libnodave.daveAnaIn, 0, 0, 2, null); if (res == 0) { LOGOAInputs = dc.getU16(); } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } public void readlogoao() { // Analoge Eingänge lesen res = dc.readBytes(libnodave.daveAnaOut, 0, 0, 2, null); if (res == 0) { LOGOAOutputs = dc.getU16(); } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } public void readlogodb() { // Analoge Eingänge lesen res = dc.readBytes(libnodave.daveDB, 0, 0, 2, null); if (res == 0) { LOGODB = dc.getU16(); } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } public void readlogoflags() { // Merker lesen res = dc.readBytes(libnodave.daveFlags, 0, 0, 1, null); if (res == 0) { LOGOFlags = dc.getU8(); } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } //Write a sequence of bytes from a buffer to PLC memory. int daveWriteBytes(daveConnection * dc, int area, int DB, int start, int len, void * buffer); //Parameters: //dc: A pointer to a daveConnection structure representing an established connection. //area: A constant that specifies a memory area in the PLC. //DB: The number of a data block. Only meaningful if area is daveDB. Use 0 oterwise. //start: The address of the first byte in the block. //len: The number of bytes to write. //buffer: A pointer to some memory space with the writedata. public void writelogoflags() { // Merker schreiben byte[] buf; buf = new byte[1]; int Adr; bool Par = false; int InputNum = 0; // int BitNum = 24; // if(Par == true) { buf[0] = 255; // TRUE } else { buf[0] = 0; // FALSE } Adr = InputNum * 8 + BitNum; Console.WriteLine("InputNum: " + InputNum); Console.WriteLine("ByteNum: " + BitNum); Console.WriteLine("Adr: " + Adr); //write Merker M0.0 res = dc.writeBits(libnodave.daveFlags, 0, Adr, 1, buf); if (res == 0) { // } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } private void timer1_Tick(object sender, EventArgs e) { //readlogoai(); readlogodb(); progressBar1.Value = LOGODB; } private void btnInfo_Click(object sender, EventArgs e) { MessageBox.Show("libnodave & LOGO! 0BA7 -- Tom Lorenz 09/2014"); } private void btnConnect_Click(object sender, EventArgs e) { connectlogo(); } private void btnDisconnect_Click(object sender, EventArgs e) { disconnectlogo(); } private void btnReadAI_Click(object sender, EventArgs e) { readlogoai(); tbTesttext.Text = LOGOAInputs.ToString(); } private void btnReadAO_Click(object sender, EventArgs e) { readlogoao(); tbTesttext.Text = LOGOAOutputs.ToString(); } private void btnReadDI_Click(object sender, EventArgs e) { readlogodi(); tbTesttext.Text = LOGODInputs.ToString(); } private void btnReadDO_Click(object sender, EventArgs e) { readlogodo(); tbTesttext.Text = LOGODOutputs.ToString(); } private void btnReadDB_Click(object sender, EventArgs e) { readlogodb(); tbTesttext.Text = LOGODB.ToString(); } private void btnReadFlags_Click(object sender, EventArgs e) { readlogoflags(); tbTesttext.Text = LOGOFlags.ToString(); } private void btnWriteFlags_Click(object sender, EventArgs e) { writelogoflags(); } private void btnLOGOLightOn_Click(object sender, EventArgs e) { // Merker schreiben byte[] buf; buf = new byte[1]; int Adr; bool Par = true; int InputNum = 0; // int BitNum = 24; // if (Par == true) { buf[0] = 255; // TRUE } else { buf[0] = 0; // FALSE } Adr = InputNum * 8 + BitNum; //write Merker M25 res = dc.writeBits(libnodave.daveFlags, 0, Adr, 1, buf); if (res == 0) { // } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } private void btnLOGOLightOff_Click(object sender, EventArgs e) { // Merker schreiben byte[] buf; buf = new byte[1]; int Adr; bool Par = false; int InputNum = 0; // int BitNum = 24; // if (Par == true) { buf[0] = 255; // TRUE } else { buf[0] = 0; // FALSE } Adr = InputNum * 8 + BitNum; //write Merker M25 res = dc.writeBits(libnodave.daveFlags, 0, Adr, 1, buf); if (res == 0) { // } else Console.WriteLine("Error " + res + " " + libnodave.daveStrerror(res)); } } }
Siemens S7-300 Eingänge auslesen
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; using System.IO; namespace S7300_Statistik { public partial class Form1 : Form { static libnodave.daveOSserialType davesocket; static libnodave.daveInterface daveiface; static libnodave.daveConnection daveconnection; //string ip = "192.168.1.113"; // Siemens LOGO! 0BA7 //int port = 102; // Siemens LOGO! 0BA7 //int portokoll = libnodave.daveprotoTCP; //string ip = "192.168.0.236"; // S7-300 IP Altbau //int port = 1099; // S7-300 IP Altbau //int protokoll = libnodave.daveProtoMPI_IBH; string ip = "192.168.1.207"; // S7-300 IP Haustechnik int port = 7777; // S7-300 IP Haustechnik int protokoll = 230; // libnodave.daveProtoNLpro = 230; static int rack = 0; // S7-300 Racknummer static int slot = 2; // S7-300 Slotnummer static int mpi = 2; // S7-300 MPI -- WICHTIG!! string logfilename = ""; //----------------------------------------------------------------------- int res=0; int daveinputs = 0; int connectionestablished = 0; double readcounter = 0; DateTime recorddate = DateTime.Now; public Form1() { InitializeComponent(); timermomentankwh.Interval = 1000; timerrecord.Interval = 30000; } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { disconnects7300(); } public static bool CheckBitSet(byte b, int BitNumber) { // Fehlerbehandlung if (BitNumber < 8 && BitNumber > -1) { return (b & (1 << BitNumber)) > 0; } else { throw new InvalidOperationException( "Der Wert für BitNumber " + BitNumber.ToString() + " war nicht im zulässigen Bereich! (BitNumber = (min)0 - (max)7)"); } } public void connects7300() { connectionestablished = 0; tbLog.AppendText("Socket öffnen\n"); davesocket.rfd = libnodave.openSocket(port, ip); tbLog.AppendText("Socket erfolgreich\n"); davesocket.wfd = davesocket.rfd; if (davesocket.rfd > 0) { tbLog.AppendText("Interface öffnen\n"); daveiface = new libnodave.daveInterface(davesocket, "IF1", 0, protokoll, libnodave.daveSpeed187k); daveiface.initAdapter(); tbLog.AppendText("Adapter erfolgreich\n"); daveiface.setTimeout(100000); tbLog.AppendText("Interface erfolgreich\n"); if (res == 0) { tbLog.AppendText("Connection öffnen\n"); daveconnection = new libnodave.daveConnection(daveiface, mpi, rack, slot); daveconnection.connectPLC(); tbLog.AppendText("Connection erfolgreich\n"); connectionestablished = 1; } else tbLog.AppendText("Status: " + res + " " + libnodave.daveStrerror(res)); } else { tbLog.AppendText("Verbindungsaufbau abgebrochen\n"); } } public void disconnects7300() { if (connectionestablished == 1) { daveiface.disconnectAdapter(); tbLog.AppendText("Disconnect Adapter erfolgreich\n"); daveconnection.disconnectPLC(); libnodave.closeSocket(davesocket.rfd); tbLog.AppendText("Disconnect PLC erfolgreich\n"); connectionestablished = 0; } } public void readdbkw() { readcounter++; recorddate = DateTime.Now; /* // Datenbaustein Momentanwert DB30 DW0 lesen daveinputs = 0; res = daveconnection.readBytes(libnodave.daveDB, 30, 0, 4, null); tbLog.AppendText("Funktion ReadDB " + readcounter + " DB30-0 erfolgreich\n"); if (res == 0) { daveinputs = daveconnection.getU32(); lblkw0.Text = daveinputs.ToString(); } else { tbLog.AppendText("Fehler Read\n"); } */ // Datenbaustein Momentanwert DB30 DW8 lesen --- Easyshow !!!! AKTUELLER WERT daveinputs = 0; res = daveconnection.readBytes(libnodave.daveDB, 30, 8, 4, null); tbLog.AppendText("Funktion ReadDB " + readcounter + " DB30-8 erfolgreich\n"); if (res == 0) { daveinputs = daveconnection.getU32(); lblkw8.Text = daveinputs.ToString(); pbmomentankw.Value = daveinputs; } else { tbLog.AppendText("Fehler Read\n"); } /* // Datenbaustein Momentanwert DB1 x lesen --- Easyshow !!!! AKTUELLER WERT daveinputs = 0; res = daveconnection.readBytes(libnodave.daveDB, 1, 0, 1, null); tbLog.AppendText("Funktion ReadDB " + readcounter + " Tick erfolgreich\n"); daveinputs = daveconnection.getU8(); if (res == 0) { if (CheckBitSet((byte)daveinputs,0)) { panelkwtick.BackColor = Color.Yellow; } else { panelkwtick.BackColor = Color.DarkGray; } } else { tbLog.AppendText("Fehler Read\n"); } */ } public void readtime() { DateTime Uhrzeit = DateTime.Now; lblplcyear.Text = Uhrzeit.Year.ToString(); lblplcmonth.Text = Uhrzeit.Month.ToString(); lblplcday.Text = Uhrzeit.Day.ToString(); lblplcstunde.Text = Uhrzeit.Hour.ToString(); lblplcminute.Text = Uhrzeit.Minute.ToString(); lblplcsekunde.Text = Uhrzeit.Second.ToString(); lblplcmillis.Text = Uhrzeit.Millisecond.ToString(); } public void recordkwh() { // Record kWh // 13.12.2013;08:23:42;45 String appendstring = lblplcday.Text+"."+lblplcmonth.Text+"."+lblplcyear.Text+";"+lblplcstunde.Text+":"+lblplcminute.Text+":"+lblplcsekunde.Text+";"+lblkw8.Text; AppendToTextFile(logfilename, appendstring); } private void AppendToTextFile(string strPath, string strLines) { using (StreamWriter streamWriter = new StreamWriter(strPath, true)) { streamWriter.WriteLine(strLines); } } private void InitiateTextFile(string strPath, string strLines) { using (StreamWriter streamWriter = new StreamWriter(strPath)) { streamWriter.WriteLine(strLines); } } // Actual total zoom value int deltaScrollTotal; private void kwchart_MouseWheel(object sender, MouseEventArgs e) { int maxChangeRange = 21; int minChangeRange = -1; int deltaScroll = e.Delta / Math.Abs(e.Delta); deltaScrollTotal += deltaScrollTotal + deltaScroll > minChangeRange && deltaScrollTotal + deltaScroll < maxChangeRange ? deltaScroll : 0; // Additional calculation in order to obtain pseudo // "positional zoom" feature double minXScale = (double)e.X / (double)kwchart.Width; double maxXScale = 1 - minXScale; double minYScale = (double)e.Y / (double)kwchart.Height; double maxYScale = 1 - minYScale; // Max and min values into which axis need to be scaled/zoomed double maxX = kwchart.ChartAreas[0].AxisX.Maximum - deltaScrollTotal * maxXScale; double minX = kwchart.ChartAreas[0].AxisX.Minimum + deltaScrollTotal * minXScale; double maxY = kwchart.ChartAreas[0].AxisY.Maximum - deltaScrollTotal * minYScale; double minY = kwchart.ChartAreas[0].AxisY.Minimum + deltaScrollTotal * maxYScale; kwchart.ChartAreas[0].AxisX.ScaleView.Zoom(minX, maxX); kwchart.ChartAreas[0].AxisY.ScaleView.Zoom(minY, maxY); } private void btnstoplogging_Click(object sender, EventArgs e) { timermomentankwh.Stop(); } private void btnreadplctime_Click(object sender, EventArgs e) { // PLC Time auslesen daveinputs = 0; res = daveconnection.readBytes(libnodave.daveTimer, 0, 110, 2, null); tbLog.AppendText("Funktion ReadTimer erfolgreich\n"); if (res == 0) { tbLog.AppendText("------Timer101--------\n"); daveinputs = daveconnection.getU8(); tbLog.AppendText("Ergebnis T101: " + daveinputs + "\n"); daveinputs = daveconnection.getU8(); tbLog.AppendText("Ergebnis T101: " + daveinputs + "\n"); } else { tbLog.AppendText("Fehler Read\n"); } } private void btnstart_Click(object sender, EventArgs e) { connects7300(); timermomentankwh.Start(); kwchart.ChartAreas[0].AxisX.MajorGrid.LineWidth = 1; kwchart.ChartAreas[0].AxisY.MajorGrid.LineWidth = 1; kwchart.ChartAreas[0].AxisX.MinorGrid.LineWidth = 1; kwchart.ChartAreas[0].AxisY.MinorGrid.LineWidth = 1; kwchart.ChartAreas[0].AxisY.MajorGrid.Interval = 100; kwchart.ChartAreas[0].AxisY.MinorGrid.Interval = 10; kwchart.ChartAreas[0].AxisY.MinorGrid.LineColor = Color.LightGray; kwchart.ChartAreas[0].AxisX.MajorGrid.Enabled = false; kwchart.ChartAreas[0].AxisX.MinorGrid.Enabled = false; kwchart.ChartAreas[0].AxisY.MajorGrid.Enabled = true; kwchart.ChartAreas[0].AxisY.MinorGrid.Enabled = true; kwchart.Series["kWh"].Color = Color.DarkGreen; kwchart.Series["kWh"].ToolTip = "#VALX{G}, #VALY kW/h"; kwchart.Series["kWh"].IsXValueIndexed = true; } private void btnstop_Click(object sender, EventArgs e) { timerrecord.Stop(); timermomentankwh.Stop(); disconnects7300(); pbmomentankw.Value = 0; } private void btnrecord_Click(object sender, EventArgs e) { DateTime logtime = DateTime.Now; logfilename = "Logfile_" + logtime.Year.ToString() + logtime.Month.ToString() + logtime.Day.ToString() + logtime.Hour.ToString() + logtime.Minute.ToString() + logtime.Second.ToString() + ".txt"; InitiateTextFile(logfilename, "Datum;Zeit;kWh"); readdbkw(); readtime(); kwchart.Series["kWh"].Points.AddXY(recorddate.ToOADate(), pbmomentankw.Value); timerrecord.Start(); } private void timermomentankwh_Tick(object sender, EventArgs e) { readdbkw(); readtime(); } private void timerrecord_Tick(object sender, EventArgs e) { recordkwh(); kwchart.Series["kWh"].Points.AddXY(recorddate.ToOADate(), pbmomentankw.Value); } private void kwchart_MouseMove(object sender, MouseEventArgs e) { //kwchart.Series["kWh"].ToolTip = "#VALX, #VALY"; } private void btnsavechart_Click(object sender, EventArgs e) { this.kwchart.SaveImage(logfilename + ".png", System.Drawing.Imaging.ImageFormat.Png); } } }
PT100 Widerstandswert in Temperatur umrechnen
aivalue = Widerstandswert tmpcalc = Temperatur tmpcalc = ((3.90802*0.1)/(2*5.802*0.00001)) - Math.Sqrt(((0.390802*0.390802)/(4*((5.802*0.00001)*(5.802*0.00001)))) - ((aivalue-100)/(5.802*0.00001)));