| 
| Autor | Beitrag |  
| oracle Hält's aus hier
 Beiträge: 5
 
 
 
 
 | 
Verfasst: So 28.06.09 14:54 
 
Hallo Zusammen,
 ich habe folgendes Problem, ich möchte eine SPS (Siemens Logo) per Serial Port auslesen und die Daten in eine Excel-Datei abspeichern. Mein Program funktioniert soweit, dass ich über Oledb die Excel_Datei auslesen und die Werte in einem DataGridView anzeigen kann. Der Connect zu SerialPort funktioniert auch einwandfrei. Aber wie kann ich die Daten auslesen und in die Excel Datei speichern? Es handelt sich um 3 Werte die zum start in A1,B1,B3 geschrieben werden sollen, ich benutze noch einen Timer der den Serialport alle 10 Sekunden ausliest, also sollen die Werte immer in die nächste Spalte geschrieben werden. Ich habe ein funktionierendes Programm in VBA aber ich komme nicht so damit klar den Quelltext in C# umzuschrieben. Wäre super wenn mir jemand helfen könnte... Den Quelltext kann ich natürlich zur Verfügung stellen..
 
 
 Grüße
 Oracle
 |  |  |  
| oracle  Hält's aus hier
 Beiträge: 5
 
 
 
 
 | 
Verfasst: So 28.06.09 19:08 
 
Hier mein Quelltext:
 			Moderiert von									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 62:
 63:
 64:
 65:
 66:
 67:
 68:
 69:
 70:
 71:
 72:
 73:
 74:
 75:
 76:
 77:
 78:
 79:
 80:
 81:
 82:
 83:
 84:
 85:
 86:
 87:
 88:
 89:
 90:
 91:
 92:
 93:
 94:
 95:
 96:
 97:
 98:
 99:
 100:
 101:
 102:
 103:
 104:
 105:
 106:
 107:
 108:
 109:
 110:
 111:
 112:
 113:
 114:
 115:
 116:
 117:
 118:
 119:
 120:
 121:
 122:
 123:
 124:
 125:
 126:
 127:
 128:
 129:
 130:
 131:
 132:
 133:
 134:
 135:
 136:
 137:
 138:
 139:
 140:
 141:
 142:
 143:
 144:
 145:
 146:
 147:
 148:
 149:
 150:
 151:
 152:
 153:
 154:
 155:
 156:
 157:
 158:
 159:
 160:
 161:
 162:
 163:
 164:
 165:
 166:
 167:
 168:
 169:
 170:
 171:
 172:
 173:
 174:
 175:
 176:
 177:
 178:
 
 | 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;
 using System.Diagnostics;
 using System.Data.OleDb;
 using System.IO;
 using System.Threading;
 using System.Globalization;
 using System.IO.Ports;
 
 
 namespace Auqamatic
 {
 public partial class Form1 : Form
 {
 private string InputDatei ="C:\\sd\\Aquamatic.xls";
 SerialPort serialPortObject;
 
 private DataSet ds =null;
 private OleDbDataAdapter da = null;
 private DataTable dt = null;
 
 public Form1()
 {
 InitializeComponent();
 }
 
 private void Form1_Load(object sender, EventArgs e)
 {
 this.Text = "Aquamatic v1.0";
 this.PopulateGrid();
 this.SetFilter();
 label1.Text = "Text kommt noch!";
 label2.Text = "Text kommt noch!";
 }
 
 private int PopulateGrid()
 {
 try
 {
 if (this.ds == null)
 {
 String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + this.InputDatei + ";" + "Extended Properties=Excel 8.0;";
 OleDbConnection objConn = new OleDbConnection(sConnectionString);
 objConn.Open();
 OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [Tabelle1$]", objConn);
 if ((this.da == null) && (this.ds == null))
 {
 this.ds = new DataSet();
 this.dt = new DataTable();
 this.da = new OleDbDataAdapter(objCmdSelect);
 this.da.SelectCommand = objCmdSelect;
 this.da.Fill(this.dt);
 this.datagrid.DataSource = dt;
 }
 objConn.Close();
 }
 
 }
 catch (Exception ex)
 {
 string msg = " Fehler beim bestücken des Datagrids";
 
 if (ex.Message != null)
 {
 msg += ex.Message.ToString() + "\n";
 }
 if (ex.InnerException != null)
 {
 msg += ex.Message.ToString() + "\n";
 }
 MessageBox.Show( msg, "Fehler", MessageBoxButtons.OK);
 }
 return 0;
 }
 
 private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
 {
 this.SetFilter();
 }
 
 
 private bool SetFilter()
 {
 if (this.ds != null)
 {
 string exp = "";
 
 exp = " datum >= ";
 exp += this.monthCalendar1.SelectionStart.ToString("#yyyy-MM-dd#");
 exp += " and datum <= ";
 exp += this.monthCalendar1.SelectionEnd.ToString("#yyyy-MM-dd#");
 this.dt.DefaultView.RowFilter = exp;
 this.dt.DefaultView.Sort = " datum";
 }
 else
 {
 return false;
 }
 
 return true;
 }
 
 private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
 {
 
 }
 
 private void button1_Click(object sender, EventArgs e)
 {
 this.Close();
 }
 
 private void button2_Click(object sender, EventArgs e)
 {
 
 serialPortObject = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);            serialPortObject.Handshake = Handshake.None;
 serialPortObject.ReadTimeout = 500;
 serialPortObject.WriteTimeout = 500;
 try
 {
 serialPortObject.Open();
 }
 catch (Exception)
 {
 label3.Text = "Comport nicht verfügbar";
 return;
 
 }
 timer1.Start();
 label3.Text = "Verbunden mit COM1";
 button2.Enabled = false;
 button3.Enabled = true;
 
 
 }
 
 private void button3_Click(object sender, EventArgs e)
 {
 timer1.Stop();
 serialPortObject.Close();
 label3.Text = "COM Port geschlossen.";
 button3.Enabled = false;
 button2.Enabled = true;
 
 }
 
 private void timer1_Tick(object sender, EventArgs e)
 {
 readSerialPort();
 }
 
 public void readSerialPort()        {
 try
 {
 string message = serialPortObject.ReadLine();
 }
 catch (TimeoutException) { }
 
 }
 
 public void sendSerialPort(String message)        {
 
 }
 
 }
 }
 |   Kha: C#-Tags hinzugefügt |  |  |  
| Christian S. 
          Beiträge: 20451
 Erhaltene Danke: 2264
 
 Win 10
 C# (VS 2019)
 
 | 
Verfasst: Mo 29.06.09 08:42 
 
Hi!
 Hast Du mal versucht, auf das DataReceived-Event des Serialports zu reagieren?
 Ich hatte das mal so gelöst:
 		                       C#-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 
 |         internal void _Port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e){
 string data = null;
 try
 {
 data = _Port.ReadLine();
 }
 catch
 {
 data = _Port.ReadExisting();
 }
 if (!String.IsNullOrEmpty(data))
 HandleData(data);
 }
 |  Grüße
 Christian_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
 |  |  |  
| oracle  Hält's aus hier
 Beiträge: 5
 
 
 
 
 | 
Verfasst: Mo 29.06.09 10:56 
 
Die Daten über den SerialPort auszulesen bekomme ich noch hin aber ich kann sie nirgends hinschreiben, wie schreibe ich die Daten dann direkt in Excel? |  |  |  
| Chemiker 
          Beiträge: 194
 Erhaltene Danke: 14
 
 XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
 BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
 
 | 
Verfasst: Mo 29.06.09 21:37 
 
Hallo oracle,
 willst Du die Daten direkt aus der SPS lesen, oder werden die Daten gesendet? 
 Beim direkten Auslesen würde ich Dir empfehlen in einem SPS-Forum die Frage zustellen, weil es von dem genauen Typ der SPS abhängt.
 [url] www.sps-forum.de/forumdisplay.php?f=20  [/url]
 Bis bald Chemiker |  |  |  
| oracle  Hält's aus hier
 Beiträge: 5
 
 
 
 
 | 
Verfasst: Mi 08.07.09 09:09 
 
Hallo Chemiker,
 ich möchte die Daten direkt aus der SPS lesen und in eine Excel-Datei speichern.
 Ich habe eine funktionierende Excel-Datei die das ganze macht, diese ist in VBA geschrieben, habe aber meine Probleme das VBA in C# umzuschreiben    Kennst du dich zufällig auch mit VBA aus? |  |  |  
| oracle  Hält's aus hier
 Beiträge: 5
 
 
 
 
 | 
Verfasst: Do 09.07.09 18:53 
 
Hier der VBA Quelltext, den ich in C# bräuchte:
 '-------------------------------------------------------------------------------------------
 ' Timer Routinen
 '-------------------------------------------------------------------------------------------
 Sub Auto_open()
 'Application.Visible = False
 'Sub cmd_TimerOn()
 Dim ok As Boolean
 ok = OpenComPort("COM1", "baud=9600 parity=E data=8 stop=1", comhandle)
 If ok Then
 
 timer_enabled = True
 intervalvalue = Round(CDbl(Range("F2").Value) * 86400, 0)
 intervalcount = intervalvalue
 Call timer_OnTimer
 Else
 End If
 End Sub
 
 Sub cmd_TimerOff()
 timer_enabled = False
 CloseComPort (comhandle)
 End Sub
 
 Sub Timer()
 
 Dim str1 As String
 Dim ok As Boolean
 Dim wrpos As Integer
 Dim temp As Byte
 Dim BA6_0 As Byte
 Dim BA6_1 As Byte
 Dim BA6_2 As Byte
 Dim ii As Byte
 
 
 wrpos = Range("G2").Value
 
 ok = ReadComPort(comhandle, str1, 200)
 If ok And (Len(str1) > 50) Then
 BA6_0 = 0
 BA6_1 = 0
 BA6_2 = 0
 If Asc(Mid$(str1, 5, 1)) > 64 Then
 BA6_0 = 8
 BA6_1 = 9
 BA6_2 = 10
 End If
 Cells(wrpos, 1).Value = Time
 Cells(wrpos, 2).Value = (Asc(Mid$(str1, 39 + BA6_2, 1)) + Asc(Mid$(str1, 40 + BA6_2, 1)) * 256) * 12 / 10 / 100
 Cells(wrpos, 3).Value = (Asc(Mid$(str1, 41 + BA6_2, 1)) + Asc(Mid$(str1, 42 + BA6_2, 1)) * 256) * 40 / 10 / 100
 Cells(wrpos, 4).Value = (Asc(Mid$(str1, 45 + BA6_2, 1)) + Asc(Mid$(str1, 46 + BA6_2, 1)) * 256) * 2 / 10 / 100
 Cells(wrpos, 5).Value = Date
 
 
 Range("G2").Value = wrpos + 1
 End If
 
 intervalcount = intervalcount - 1
 
 If intervalcount <= 0 Then
 intervalcount = intervalvalue
 ok = WriteComPort(comhandle, Chr$(85) + Chr$(19) + Chr$(19) + Chr$(0) + Chr$(170), 5)
 End If
 
 End Sub
 
 Sub timer_OnTimer()
 If timer_enabled Then
 Call Timer
 Application.OnTime (Now + TimeValue("00:00:01")), "timer_OnTimer"
 End If
 End Sub
 |  |  |  
| Chemiker 
          Beiträge: 194
 Erhaltene Danke: 14
 
 XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
 BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
 
 | 
Verfasst: Sa 11.07.09 09:51 
 
Hallo oracle,
 ich kann Dir da leider nicht weiterhelfen (noch nicht), weil meine Kenntnisse in C# dafür noch nicht ausreichen. Bin erst dabei mich in C# einzuarbeiten.
 
 Bis bald Chemiker
 |  |  |  |