Autor Beitrag
oracle
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 28.06.09 15: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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 28.06.09 20:08 
Hier mein Quelltext:

ausblenden volle Höhe C#-Quelltext
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);//Parität=gerade
            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;
           //-----------------------------------

            //Hier soll der Serialport ausgelesen und die Daten in Excel gespeichert werden!
      
        }

        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(); //Intervall 1000

        }

        public void readSerialPort()//anstehende daten am COM Port einlesen
        {
            try
               {
                   string message = serialPortObject.ReadLine();
               }
            catch (TimeoutException) { }
       
        }

        public void sendSerialPort(String message)//Übergebene Nachricht über COM port verschicken und in Log eintragen
        {
            
       }

    }
}


Moderiert von user profile iconKha: C#-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 29.06.09 09:42 
Hi!

Hast Du mal versucht, auf das DataReceived-Event des Serialports zu reagieren?

Ich hatte das mal so gelöst:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 29.06.09 11: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
BeitragVerfasst: Mo 29.06.09 22: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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 08.07.09 10: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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 09.07.09 19: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
BeitragVerfasst: Sa 11.07.09 10: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