將信捷PLC中的資料存入MySQL(RTU&TCP)
Q:巴妖妖武妻妻久靈靈
uj5u.com熱心網友回復:
沒人接的么,不費時間的專案啊
uj5u.com熱心網友回復:
信捷PLC有資料介面嗎?能取出資料嗎?如果能,哪不是就對資料庫的新增操作嗎?uj5u.com熱心網友回復:
有,而且我也取出來了存到了資料庫,但是資料有缺失。知識有限無奈只能找人幫忙寫一個。
鏈接是我寫的 https://download.csdn.net/download/nebuung/12928267
uj5u.com熱心網友回復:
看到設定的免費下載還收C幣,代碼全部貼了
using System;
using System.Windows.Forms;
using Modbus.Device;
using System.IO.Ports;
using MySql.Data.MySqlClient;
namespace Modbus72
{
public partial class MainForm : Form
{
private static IModbusMaster master;
private static SerialPort port;
//寫線圈或寫暫存器陣列
private bool[] coilsBuffer;
private ushort[] registerBuffer;
//引數(分別為站號,起始地址,長度)
private byte slaveAddress;
private ushort startAddress;
private ushort startAddress1;
private ushort numberOfPoints;
private ushort numberOfPoints1;
//串口引數 串口名 波特率 校驗 資料位 停止位
private string portName;
private int baudRate;
private Parity parity;
private int dataBits;
private StopBits stopBits;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
timer1.Interval = 3000;
btnstart.Enabled = true;
btnstop.Enabled = false;
}
private SerialPort InitSerialPortParameter()
{
if (cbxcom.SelectedIndex < 0)
{
MessageBox.Show("請選擇串口號");
return null;
}
else
{
portName = cbxcom.SelectedItem.ToString();
baudRate = 19200;
parity = Parity.Even;
dataBits = 8;
stopBits = StopBits.One;
port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
return port;
}
}
private void btnread_Click(object sender, EventArgs e)
{
try
{
//初始化串口引數
InitSerialPortParameter();
master = ModbusSerialMaster.CreateRtu(port);
ExecuteFunction();
}
catch (Exception)
{
MessageBox.Show("初始化例外");
}
}
private void ExecuteFunction()
{
slaveAddress = byte.Parse("1");
string today = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
String connetStr = "server=10.10.20.5;port=3309;user=root;password=rootqsr; database=db_qualitymanager;";
MySqlConnection conn = new MySqlConnection(connetStr);
try
{
//每次操作是要開啟串口 操作完成后需要關閉串口
//目的是為了slave更換連接是不報錯
if (port.IsOpen == false)
{
port.Open();
}
startAddress = ushort.Parse("0");
numberOfPoints = ushort.Parse("20");
//讀取線圈
coilsBuffer = master.ReadCoils(slaveAddress, startAddress, numberOfPoints);
for (int i = 0; i < coilsBuffer.Length; i++)
{
bool m = coilsBuffer[i];//線圈狀態
if (m == true)
{
//讀取暫存器
int j = i * 4 + 6;
startAddress1 = ushort.Parse(j + "");
numberOfPoints1 = ushort.Parse("3");
registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress1, numberOfPoints1);
string x = registerBuffer[0] + "";
string y = registerBuffer[2] + "";
if (x == "0")
{
continue;
}
else
{
if (i < 10)
{
#region
string dpr = "z_0" + i;
conn.Open();
string sql = string.Format("insert into " + dpr + "(vultime,opetime,prdate) values ('{0}','{1}','{2}')", x, y, today);
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
//修改暫存器
string s = j + "";
startAddress = ushort.Parse(s);
string[] strarr = { "0" };
registerBuffer[0] = ushort.Parse(strarr[0]);
master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
#endregion
}
else
{
#region
string dpr = "z_" + i;
conn.Open();
string sql = string.Format("insert into " + dpr + " (vultime,opetime,prdate) values ('{0}','{1}','{2}')", x, y, today);
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
//修改暫存器
string s = j + "";
startAddress = ushort.Parse(s);
string[] strarr = { "0" };
registerBuffer[0] = ushort.Parse(strarr[0]);
master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
#endregion
}
}
}
//SetMsg(coilsBuffer[i] + " ");
}
//SetMsg("\r\n");
port.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void SetMsg(string msg)
{
showdetail.Invoke(new Action(() => { showdetail.AppendText(msg); }));
}
private void btnclear_Click(object sender, EventArgs e)
{
showdetail.Clear();
}
private void btnstart_Click(object sender, EventArgs e)
{
timer1.Start();
btnstart.Enabled = false;
btnstop.Enabled = true;
}
private void btnstop_Click(object sender, EventArgs e)
{
timer1.Stop();
btnstart.Enabled = true;
btnstop.Enabled = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
btnread.PerformClick();
}
}
}
uj5u.com熱心網友回復:
我是不知道怎么改自己的代碼,求大神幫忙寫個可用的,Q在一樓,馬尼好說uj5u.com熱心網友回復:
可以看看NModBus這個庫.轉載請註明出處,本文鏈接:https://www.uj5u.com/net/181586.html
標籤:C#
上一篇:如何在framework4.5.2版本上使用Roslyn?
下一篇:C#寫的雪花分形
