C#工控上位机开发
对于电源软件开发者来说,上位机的开发难度是远远小于下位机的,之前几个月我一直在研究电力电子技术和下位机的控制算法,也有了一点点的收获,但说实话还是差的太远了,而且人力物力资源非常稀缺,为了做个负反馈控制实验还得自己掏钱买电机,到后来又发现负反馈电路还得专业人士搭建,示波器乱漆芭蕉的波形仿佛测的是自己的心电图,无奈。不过后续我会梳理一下这方面开发的学习心得,不得不说,整个电源的自主研发过程真的是道阻且长。
鲁迅先生曾经说过,柿子得挑软的捏,而且厂里确实也有需求,所以最近花了两周时间在开发工控上位机软件。虽说是个软柿子,但捏的确实不轻松(或许这就是弱者的世界吧T.T),不过不管怎么样,最终也是开发成功了,不枉我两周的爆肝。
那么废话不多说了,进入正题。
一.开发前的准备
(1)编程环境
我选用的编程环境是Vsual Studio 2019,之前在学linux操作系统时用过QTCreator,感觉两者也差不多,不过VS在制作窗体应用程序时采用的语言是C#,QT采用的是C++。C#是面向对象的,但语法上来看又是C,基本上懂C和C++的话,C#都能无师自通了。VS在官网上可以直接搜索下载,下载的教程也是比较丰富的,这里不做过多介绍。在选择工作负载时要确定好自己的设计目标,比如是进行游戏开发,还是网站开发,又或者是做个简单的窗体应用小程序,在进行窗体程序开发时是需要下载.netFramework框架的,框架已有多个版本,在确立好框架版本后你制作窗体软件的整个过程都是依赖于它的,(注意更新VS后,之前的框架可能会被删除,这个时候得去官网上找你之前的项目所依赖的.netFramework框架版本)。
因为是依赖于.netFramework框架的,因此很多底层的程序都是写完封装在类库里,只需要进行调用即可,当然开发过程中你也可以自己去写类库并进行添加和调用。
打开VS——>创建新项目——>搜索选择windows窗体应用(.netFramework)模板——>编辑项目名称,存储位置等——>创建,完成后会显示如下所示界面。
在.cs[设计]中会有一个窗体,左边是工具箱,如果工具箱不见了可以按快捷键Ctrl+Alt+X,在工具箱中会有大量的控件,比如按钮,文本框,下拉框,进度条,定时器等等,制作时将该控件拖动到窗体中就行了,右边的属性就是你来对控件的操作,其实窗体也是个控件,因此上图的属性里就是对窗体进行设置,属性框里的闪电记号是事件的意思,当发生了某种事件时会执行的相应操作,可以通过双击某个事件进入.CS*的编程界面。那么窗体应用程序的整个开发也就是由这些基本的操作来展开的。
(2)下位机仿真
下位机采用的是西门子PLC,CPU型号是S7-1200,通信选择的是profinet通信协议。但控制板在工厂里的电源柜里使用中,实际的开发不可能跑现场去写一下运行一下。而想要进行完整的仿真我用到了两个软件,TIA Portal V16和S7-PLCSIM Advanced V3.0,前者为PLC控制板提供了编程环境,它本身可以当成一个PLC板,后者可以建立虚拟PLC与上位机的通信。
该图是TIA Portal V16某项目正在运行的界面。市面上的PLC控制板五花八门,每一种编程方式或者通信协议可能都不太一样,所以工控人多多少少有点难做,不过自主研发控制板就没那么纠结了,自产自销才是王道,毕竟学人家的完事儿了还得问人家买,典型的吃力不讨好。
下面说下TIA Portal V16打开后的一些操作。
- 创建一个新项目——>项目视图
- 添加一个CPU——>比如S7-1500
- CPU属性——>常规——>安全与防护——>允许远程访问
- 项目名——>属性——>保护——>允许块编译时仿真
- 程序块——>添加新块——>数据块
- 创建一个新数据类型后——>数据块——>属性——>常规——>属性——>取消所有勾选
- 工具下方的——>下载——>PC/PG接口(选择Siemens PLCSIM virtual Ethernet Adapter)——>开始搜索——>开始下载——>转至在线
在第七步下载之前需要打开PLCSIM仿真软件,否则在接口中是找不到想要的选项的。下图是进行配置时需要注意的一些事项:
首先是打开网络适配设置找到PLC的以太网,将IP地址改为与PLC处于同一网段的地址,然后在仿真软件里按如图所示进行连接,注意如果Online Acess选项中无法将按钮转至右侧,需要下载WinPcap,它可以提供网络接口。
在做好这些工作之后就可以通过编程来实现与PLC之间的数据通信了。
(3)数据库
数据库软件选择的是SQL Srever
SQL Server 2019 安装教程_SZU_黄其才-CSDN博客
这个博主写了详细的安装和配置细节。
对数据库的所有操作都可以通过输入指令来完成(这也是为什么其他应用程序能够操作数据库的根本原因),当然能点击肯定还是点击方便,毕竟那些脚本指令也是挺多的,而且不太好记。因此可以很方便的通过点击去建立一个表并确定好各列的名称,对主键进行设置,是否允许控制,存储的数据类型等。
二.开发思路及代码详解
(1)实时显示系统时间
用到一个timer控件(工具箱组件里的,注意和日历控件区分)和一个label控件。Timer控件就是定时器,从功能来看类似于多线程的死循环,都拖入窗体后单击定时器在属性行为里把Enabled改为false,interval改成1000或者100也行,这代表它每100毫秒或是1000毫秒获取执行一次,(当然也可以在代码里进行更改,代码的优先级应该是高一点的吧)
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒 ddd");
}
执行的内容是将label1的文本内容进行方法(函数)返回值的赋值,该方法的作用是获取系统当前的时间并转化成字符串形式,如果要改成12小时制将HH改为hh即可,或者想以别的样式显示,但是某些特定的字符串在该方法中的显示出来的内容是固定的,比如ss返回的必然是系统的秒钟。
(2)连接PLC控制板
首先需要在VS添加一个程序包,操作方法是工具——>NuGet包管理器——>管理解决方案的程序包,在浏览中搜索S7netplus,安装
安装完成后在命名空间中引用 using S7.Net 即可(类似于添加头文件)
private Plc myplc;//实例化plc
private void radioButton5_CheckedChanged(object sender, EventArgs e)
{
if (radioButton5.Checked == true)
{
myplc = new Plc(CpuType.S71200, "192.168.0.1", 0, 1);//Cpu型号,plc地址,机架号,插槽号
try
{
myplc.Open();
}
catch (Exception EX)
{
MessageBox.Show(EX.Message);
}
}
}
Try,catch语句用try来执行某个操作,当出现错误后catch执行某个操作,这里try的任务是与plc进行连接,出现错误的话,错误信息保存到变量EX中,由Messagebox(消息盒子)弹出错误信息。最外一层代表检测单选框的值是否改变,如果方式改变则触发事件,事件内容是判断单选按钮radiobutton5是否被选中,若被选中则打开(我在窗体加载事件中将该值赋值true,意味着一旦开始程序,plc就会打开)。
(3)文本框显示plc数据
首先这类文本框的作用是用来显示数据的,因此在相关属性中设置ReadOnly的值为true,这样用户就不可以对该文本框进行编辑了。
private void timer2_Tick(object sender, EventArgs e)
{
float c = ((uint)myplc.Read("DB1.DBD6.0")).ConvertToFloat();
textBox1.Text = c.ToString();
}
这里又用到了一个定时器,因为读取数据是一个循环往复的过程。Myplc.read是从plc读取数据,括号里参数的含义首先DB1代表是从编号为1的数据块读取的,DBD表示双字,其他的如DBW表示字,DBB表示字节,DBX表示位,6.0表示偏移量,由于在PLC中我们的数据是real型,也就是浮点型,转化的时候先转化为无符号整形(uint),再通过ConvertToFloat()方法转化为浮点型,定义一个浮点型变量c去保存这个数据,最后通过tostring方法将c保存的浮点型数据转化为字符串赋值给文本框内容。此外此次用到的布尔型数据转化方法bool a = (bool)myplc.Read("DB1.DBX4.0");其他数据类型暂不多做介绍。
(4)文本框写入plc数据
在实际操作过程中免不了要由用户输入值来控制plc的数据,比如我要设定一个输出电流值,或者打开某个开关,这都涉及到对plc中的数据进行写入。
private void textBox7_TextChanged(object sender, EventArgs e)
{
if (textBox7.Text == 1.ToString())
{
myplc.Write("DB1.DBD10.0",1);
}
else if(textBox7.Text == 2.ToString())
{
myplc.Write("DB1.DBD10.0", 2);
}
else
{
textBox7.Text = "";
MessageBox.Show("输入错误!");
}
}
因为不是最终版本,此段代码仅表示一个例子,myplc.write方法的两个参数分别表示数据块的地址和想要写入数据块的值,当输入的值为1时,把plc中该地址的值置1,当输入的值为2时,把plc中该地址的值置2,其他情况弹出弹窗表示输入错误。
(5)指示灯
关于指示灯其实一开始我是想找个相关的控件的,网上似乎也是有这种控件的,但后来发现是收费的,那就大可不必了。
private void timer2_Tick(object sender, EventArgs e)
{
float c = ((uint)myplc.Read("DB1.DBD6.0")).ConvertToFloat();
textBox1.Text = c.ToString();
if(c>2000)
{
pictureBox1.Image = Image.FromFile("C:\\Users\\DELL\\source\\图片素材\\微信图片_20211019080709.jpg");
}
}
那么采用的方式是刷新picturebox控件的图片,在创建picturebox控件时可以在属性-外观-Image中导入初始图片,(这个图片的格式是否有限制还不太清除,不过就目前来看.jpg和.png类型的图片都可以导入)然后当某个变量的值到达某个点后更换该控件显示的图片,从而达到指示灯的作用,当然是否美观与导入的图片是有关联的,在调用Image.Fromfile方法时应注意地址格式。
(6)打开子窗体
前面说过,窗体本质上也是一个控件,不过添加方式不太一样。项目——>添加窗体(windows窗体)——>选择窗体并设置好名称即可。创建完该窗体后就可以通过其他窗体里的控件事件来打开该窗体了。
private void button2_Click(object sender, EventArgs e)
{
new Form2().Show();
}
这是通过一个按钮的点击事件打开窗体的方法。
(7) 连接数据库及数据存储进数据库
在开发前的准备中已经将数据库配置好了,首先打开数据库并连接。在命名空间中引入数据库相关库文件
using System.Data.SqlClient;
private void timer3_Tick(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string a = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
float c = ((uint)myplc.Read("DB1.DBD6.0")).ConvertToFloat();
//添加数据库
string strInsert = "INSERT INTO [dbo].[Table_1]([时间] ,[第一路输出电流],[第二路输出电流],[电压])VALUES('" + a + "','" + c.ToString() + "','" + c.ToString() + "','" + c.ToString() + "')";
SqlCommand comm = new SqlCommand(strInsert, connection);
try
{
int rc = comm.ExecuteNonQuery();
}
catch(Exception ex)
{
// MessageBox.Show(ex.Message);
}
connection.Close();
}
在这里又用到了一个定时器,因为数据是需要实时进行存储的。
第一句建一个名字叫connection的连接对象,
第二句是这个对象的连接字符串属性为(1.连接服务器时的服务器名称,打开数据库连接可以看到,2.连接的数据库的名字,3.连接安全性的设置吧,这点可照抄),
第三句打开这个对象,也就是打开数据库。
之前说过,对数据库的所有操作都有相应的脚本语句,因此定义了一个字符串strInsert来保存即将输入给数据库的脚本语句,语句的书写格式如代码所示,注意其中字符串的拼接。
Sqlcommond 建一个负责连接脚本指令的对象comm,sqlcommond方法里的参数分别是你要发送的指令和你的连接对象。在执行该语句后就相当于你已经在数据库中输入了该指令。如上文中的指令就是向数据库中的这些列插入某某变量的值,Sql server的脚本指令非常多,使用的时候需要根据具体需求去查,这里就不做汇总了。
下面try中定义了一个整型变量去接受comm.ExecuteNonQuery方法的返回值,该变量返回的值是受影响的行数,当返回的值为-1,说明输入的指令错误,不是insert型或是delete型或是updata型,因此在脚本指令不是这三种类型开头的情况下无法使用该方法去判断受影响的行数。但是有别的方法可以判断,在下面会讲到。
(8)实时曲线
这一部分是整个开发过程中最困难的一环,相当于一个低配版示波器。我本来应该分成几个部分来讲,但是代码中这几个部分绑在一起,干脆一并讲了。
首先曲线的话VS里是有自带的chart图表控件的,但是听说该控件的实时性不是很好,于是从网上下载了ZedGraph控件,搜索后在官网就能够下载,该控件是一个开源免费且功能强大的图表控件,你几乎可以使用它绘制出任何你想绘制的图表,下载完成后点击视图——工具箱——选择项——.Net Framework 组件——浏览——找到ZedGraph.dll并点击“打开”按钮,然后ZedGraphControl出现在.Net Framework 组件列表中——选中ZedGraphControl,然后点击“确定”按钮,即可在工具箱中看见ZedGraphControl控件。在使用该控件时有个非常难受的地方就是控件里的属性和事件全是英文,包括解释也是英文,所以英文不好用起来确实有点折磨。
同样的,引用该控件需要在命名控件引入控件相关库文件。
using ZedGraph;
private void timer5_Tick (object sender, EventArgs e)
{
//曲线
GraphPane panel = zgc.GraphPane;//控件声明
PointPairList listAmp = new PointPairList();//电压曲线声明
PointPairList listFreq = new PointPairList();//电流曲线声明
LineItem cureAmp = panel.AddCurve("电压", listAmp, Color.Red, SymbolType.None);//电压曲线规格赋值
LineItem cureFreq = panel.AddCurve("电流", listFreq, Color.Blue, SymbolType.None);//电流曲线规格赋值
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
//cureFreq.
panel.Title.Text = "电压电流实时曲线";//标题
panel.XAxis.Title.Text = "时间/s";//横坐标
panel.YAxis.Title.Text = "电流/A";//纵坐标
panel.Y2Axis.Title.Text = "电压/V";//纵坐标2
panel.Y2Axis.IsVisible = true;//纵坐标2显示使能
panel.Title.FontSpec.Family = "Arial";//标题字体样式
panel.Title.FontSpec.Size = 26;//标题字体大小
panel.Title.FontSpec.IsBold = true;//标题字体粗体显示
zgc.PanModifierKeys = Keys.Shift;//想用鼠标拖动坐标轴的话得按住shift
zgc.IsEnableHPan = true; // 鼠标拖动时允许横向移动
zgc.IsEnableVPan = true; // 鼠标拖动时允许纵向移动
zgc.IsShowContextMenu = true;//鼠标右键菜单
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;//上x轴大刻度禁止显示
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;//上x轴小刻度禁止显示
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
zgc.IsEnableVZoom = true; // 纵轴允许缩放
zgc.IsEnableHZoom = true; // 横轴允许缩放
zgc.ZoomStepFraction = 0.03; // 缩放速度
zgc.IsShowCursorValues = true;
panel.YAxis.Scale.BaseTic = 0; // 纵坐标轴的起点从零开始
panel.Y2Axis.Scale.BaseTic = 0; // 纵2坐标轴的起点从零开始
panel.YAxis.Scale.Min = 0;//纵坐标最小值为0
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
panel.Y2Axis.Scale.Min = 0;///纵坐标2最小值为0
panel.Y2Axis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴2的最大值
panel.XAxis.Scale.MinAuto = false; // 根据数据自动匹配横坐标轴的最小值
panel.XAxis.Scale.MaxAuto = true; // 根据数据自动匹配横坐标轴的最大值
panel.XAxis.Scale.IsVisible = true; // 允许显示x轴刻度值
panel.XAxis.Scale.MajorStepAuto = true;//大刻度自动匹配
panel.XAxis.Scale.MinorStepAuto = true;//小刻度自动匹配
panel.Fill = new Fill(Color.Yellow, Color.Pink, 45.0f); // 从左上角45.0°开始,从黄色过渡到粉色
zgc.IsShowPointValues = true;//鼠标移动到某个点时显示该点坐标
zgc.IsZoomOnMouseCenter = true;//以鼠标为中心进行放大
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string strSQL = "select top 600 * from Table_1 order by 时间 desc";//选择数据表数据的行数
SqlCommand comm = new SqlCommand(strSQL, connection);
SqlDataAdapter da = new SqlDataAdapter(strSQL, connection);
DataSet ds = new DataSet();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
Double[] szy = new Double[dataGridView1.RowCount];//Y轴的数据数组
string[] dates0 = new string[dataGridView1.RowCount];//制作string类型数组,这个数组存的是数据库最近保存的数据的时间信息
for (int i =0; i <600; i++)//i表示行标
{
listAmp.Add(i, Convert.ToDouble(dataGridView1[3, 599-i].Value.ToString()));
listFreq.Add(i, Convert.ToDouble(dataGridView1[3, 599 - i].Value.ToString())+1000);
szy[i] = Convert.ToDouble(dataGridView1[3, 599-i].Value.ToString());
dates0[i] = dataGridView1[0, 599-i].Value == null ? "" : dataGridView1[0,599-i].Value.ToString();
}
panel.XAxis.Type = AxisType.Text;//x轴选择为日期格式
panel.XAxis.Scale.TextLabels = dates0;//数据显示格式为分秒
zgc.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标
Refresh(); // 把变化后的点集显示在图里
connection.Close();
panel.CurveList.Clear();//清除这次的曲线
}
因为是实时曲线,因此整个函数也是封装在一个定时器里面的,每隔一秒刷新一次,注释基本都写了,下面讲一下注释没有提到的内容。首先是数据表控件DataGridView,上文已经实现了向数据库中写入数据了,那么从数据库中读取数据就需要用到数据表了,在连接数据库后向数据库写指令"select top 600 * from Table_1 order by 时间 desc",那么这句脚本指令是什么意思呢,它表示获取数据表中最近的600条数据,如果程序一直在运行,那么最近的600条数据其实就是最近600秒的数据,DataSet方法调用的是缓冲区数据,SqlDataAdapter类与SqlCommand类似,不过它针对的是缓冲区,因此算是后者的增强版,这里没有把SqlCommand屏蔽掉也没有影响。DataAdapter将数据从数据表拿到手保存到da中,ds用来表示缓冲区数据,然后da.Fill(ds)表示把da里的所有数据给到缓冲区,然后再由数据表读取出缓冲区数据。到现在我们就可以得到一个只显示最近600条数据的表格了,但是难点是如何将这写数据传达给曲线控件。其实想通了并不算复杂,首先我们是在一个定时器里,因此只需要将某一时刻的坐标值包括曲线确定下来,然后在末尾去加一个坐标轴更新和曲线清除,那么每次计时时都会重新进行绘制当下时刻的曲线,从而实现动态刷新,那么问题就转变成怎样将一个静态的数据导入到曲线控件中。ZedGraph控件是按照给的点然后连线完成曲线图的。我们定义两个数组去保存该时刻的变量,用一个Double型数组保存某一时刻y轴的点,用一个string类型的数组去保存同一时刻的时间数据,Rowcount代表行数,有多少行这个数组就存多少个数据。用一个for循环来将数组中的值赋给listXX.Add,我这里有两条曲线,因此将第二条曲线的y值+1000以区分,同时x轴的数据是不能直接赋值的,因为他是个时间数据,是个字符串,所以直接用i代替,然后在for循环下面一句对x轴的时间进行表现,但因为我时间数据过于详细,所以显示的点也是比较有限,dataGridview[,]数组里的两个数据分别是第几列和第几行的意思,599-i的原因是数据表中表头数据是最新时刻的数据,如果使用i那么x轴的时间就反过来显示了,最后因为是实时曲线,所以将该数据表隐藏了,在数据表控件属性-Visible改为false即可。
(8)选择起始时间和结束时间获取数据表信息和曲线
首先通过下拉框的形式由用户来确认可供选择的时间,这里是在窗体二加载过程中对下拉框内容的赋值过程。
private void Form2_Load(object sender, EventArgs e)
{
int i,j,k,l,m;
for (i=2021;i<2041;i++)//年
{
comboBox1.Items.Add(i.ToString());
comboBox7.Items.Add(i.ToString());
}
for (j = 1; j < 10; j++)//月
{
comboBox2.Items.Add('0'+j.ToString());
comboBox8.Items.Add('0'+j.ToString());
}
for (j = 10; j < 13; j++)
{
comboBox2.Items.Add(j.ToString());
comboBox8.Items.Add(j.ToString());
}
for (k = 1; k < 10; k++)//日
{
comboBox3.Items.Add('0'+k.ToString());
comboBox9.Items.Add('0'+k.ToString());
}
for(k=10;k<32;k++)
{
comboBox3.Items.Add(k.ToString());
comboBox9.Items.Add(k.ToString());
}
for (l = 1; l < 10; l++)//时
{
comboBox4.Items.Add('0'+l.ToString());
comboBox10.Items.Add('0'+l.ToString());
}
for (l = 10; l < 25; l++)//时
{
comboBox4.Items.Add(l.ToString());
comboBox10.Items.Add(l.ToString());
}
for (m = 0; m < 10; m++)//分秒
{
comboBox5.Items.Add('0'+m.ToString());
comboBox6.Items.Add('0'+m.ToString());
comboBox11.Items.Add('0'+m.ToString());
comboBox12.Items.Add('0'+m.ToString());
}
for (m = 10; m < 60; m++)//分秒
{
comboBox5.Items.Add(m.ToString());
comboBox6.Items.Add(m.ToString());
comboBox11.Items.Add(m.ToString());
comboBox12.Items.Add(m.ToString());
}
}
下面就是由用户选择数据了,基本上是一些对用户输入数据是否正确的逻辑判断,首先判断是否是否有哪个框没选,然后判断两个时间的先后顺序是否正确,如果错误是哪个数据发生了错误,剩下的操作和实时曲线几乎差不多,有一点需要的注意到的,当用户输入的两个时间点的数据量非常庞大或者两个时间点间数据量非常小,那么数据表中的行数我们如何得知,因为这是由用户的输入来决定的,上面说过,comm.ExecuteNonQuery方法只能用来获取特定脚本输入的返回行,而现在对数据库的指令内容是获取并返回两个时间节点之间的所有数据,开头的脚本指令是Select,因此只能另谋他路。从数据库中读取多少行行不通,但是可以从数据表中想办法,在数据表被写入之前所有的数据都是存在于缓冲区的,这个时候我们可以直接对缓冲区的行数进行读取,定义一个整形变量count去保存dt.row.count就行,然后下面的for循环中i小于的值就是count。代码如下:
private void button1_Click(object sender, EventArgs e)
{
if(comboBox1.Text==""||comboBox2.Text==""||comboBox3.Text==""||comboBox4.Text==""||comboBox5.Text==""||comboBox6.Text==""||comboBox7.Text==""||comboBox8.Text==""||comboBox9.Text==""||comboBox10.Text==""||comboBox11.Text==""||comboBox12.Text=="")
{
MessageBox.Show("请将选取时间段设定完整!");
}
else
{
if(Convert.ToInt32(comboBox1.Text)> Convert.ToInt32(comboBox7.Text))
{
MessageBox.Show("年份顺序错误!请重新确立!");
}
else if(Convert.ToInt32(comboBox1.Text) < Convert.ToInt32(comboBox7.Text))
{
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string strSQL = "select * from Table_1 where 时间>='" + comboBox1.Text + "-" + comboBox2.Text + "-" + comboBox3.Text + " " + comboBox4.Text + ":" + comboBox5.Text + ":" + comboBox6.Text + "' and 时间<='" + comboBox7.Text + "-" + comboBox8.Text + "-" + comboBox9.Text + " " + comboBox10.Text + ":" + comboBox11.Text + ":" + comboBox12.Text + "'";
SqlCommand comm = new SqlCommand(strSQL, connection);
SqlDataAdapter da = new SqlDataAdapter(strSQL, connection);
DataSet ds = new DataSet();
da.Fill(ds, "Table_1");
dataGridView1.DataSource = ds.Tables["Table_1"];
SqlDataAdapter dant = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dant.Fill(dt);
int count = dt.Rows.Count;
//曲线
GraphPane panel = zgc.GraphPane;//控件声明
PointPairList listAmp = new PointPairList();//电压曲线声明
PointPairList listFreq = new PointPairList();//电流曲线声明
LineItem cureAmp = panel.AddCurve("电压", listAmp, Color.Red, SymbolType.None);//电压曲线规格赋值
LineItem cureFreq = panel.AddCurve("电流", listFreq, Color.Blue, SymbolType.None);//电流曲线规格赋值
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
//cureFreq.
panel.Title.Text = "电压电流实时曲线";//标题
panel.XAxis.Title.Text = "时间/s";//横坐标
panel.YAxis.Title.Text = "电流/A";//纵坐标
panel.Y2Axis.Title.Text = "电压/V";//纵坐标2
panel.Y2Axis.IsVisible = true;//纵坐标2显示使能
panel.Title.FontSpec.Family = "Arial";//标题字体样式
panel.Title.FontSpec.Size = 26;//标题字体大小
panel.Title.FontSpec.IsBold = true;//标题字体粗体显示
zgc.PanModifierKeys = Keys.Shift;//想用鼠标拖动坐标轴的话得按住shift
zgc.IsEnableHPan = true; // 鼠标拖动时允许横向移动
zgc.IsEnableVPan = true; // 鼠标拖动时允许纵向移动
zgc.IsShowContextMenu = true;//鼠标右键菜单
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;//上x轴大刻度禁止显示
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;//上x轴小刻度禁止显示
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
zgc.IsEnableVZoom = true; // 纵轴允许缩放
zgc.IsEnableHZoom = true; // 横轴允许缩放
zgc.ZoomStepFraction = 0.03; // 缩放速度
zgc.IsShowCursorValues = true;
panel.YAxis.Scale.BaseTic = 0; // 纵坐标轴的起点从零开始
panel.Y2Axis.Scale.BaseTic = 0; // 纵2坐标轴的起点从零开始
panel.YAxis.Scale.Min = 0;//纵坐标最小值为0
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
panel.Y2Axis.Scale.Min = 0;///纵坐标2最小值为0
panel.Y2Axis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴2的最大值
panel.XAxis.Scale.MinAuto = false; // 根据数据自动匹配横坐标轴的最小值
panel.XAxis.Scale.MaxAuto = true; // 根据数据自动匹配横坐标轴的最大值
panel.XAxis.Scale.IsVisible = true; // 允许显示x轴刻度值
panel.XAxis.Scale.MajorStepAuto = true;//大刻度自动匹配
panel.XAxis.Scale.MinorStepAuto = true;//小刻度自动匹配
panel.Fill = new Fill(Color.Yellow, Color.Pink, 45.0f); // 从左上角45.0°开始,从黄色过渡到粉色
zgc.IsShowPointValues = true;//鼠标移动到某个点时显示该点坐标
zgc.IsZoomOnMouseCenter = true;//以鼠标为中心进行放大
Double[] szy = new Double[dataGridView1.RowCount];//Y轴的数据数组
string[] dates0 = new string[dataGridView1.RowCount];//制作string类型数组,这个数组存的是数据库最近保存的数据的时间信息
for (int i = 0; i < count; i++)//i表示行标
{
listAmp.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()));
listFreq.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()) + 1000);
szy[i] = Convert.ToDouble(dataGridView1[3,i].Value.ToString());
dates0[i] = dataGridView1[0,i].Value == null ? "" : dataGridView1[0,i].Value.ToString();
}
panel.XAxis.Type = AxisType.Text;//x轴选择为日期格式
panel.XAxis.Scale.TextLabels = dates0;//数据显示格式为分秒
zgc.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标
Refresh(); // 把变化后的点集显示在图里
connection.Close();
}
else
{
if(Convert.ToInt32(comboBox2.Text)>Convert.ToInt32(comboBox8.Text))
{
MessageBox.Show("月份顺序错误!请重新确立!");
}
else if (Convert.ToInt32(comboBox2.Text) < Convert.ToInt32(comboBox8.Text))
{
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string strSQL = "select * from Table_1 where 时间>='" + comboBox1.Text + "-" + comboBox2.Text + "-" + comboBox3.Text + " " + comboBox4.Text + ":" + comboBox5.Text + ":" + comboBox6.Text + "' and 时间<='" + comboBox7.Text + "-" + comboBox8.Text + "-" + comboBox9.Text + " " + comboBox10.Text + ":" + comboBox11.Text + ":" + comboBox12.Text + "'";
SqlCommand comm = new SqlCommand(strSQL, connection);
//new Form4().Show();
SqlDataAdapter da = new SqlDataAdapter(strSQL, connection);
DataSet ds = new DataSet();
da.Fill(ds, "Table_1");
dataGridView1.DataSource = ds.Tables["Table_1"];
SqlDataAdapter dant = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dant.Fill(dt);
int count = dt.Rows.Count;
//曲线
GraphPane panel = zgc.GraphPane;//控件声明
PointPairList listAmp = new PointPairList();//电压曲线声明
PointPairList listFreq = new PointPairList();//电流曲线声明
LineItem cureAmp = panel.AddCurve("电压", listAmp, Color.Red, SymbolType.None);//电压曲线规格赋值
LineItem cureFreq = panel.AddCurve("电流", listFreq, Color.Blue, SymbolType.None);//电流曲线规格赋值
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
//cureFreq.
panel.Title.Text = "电压电流实时曲线";//标题
panel.XAxis.Title.Text = "时间/s";//横坐标
panel.YAxis.Title.Text = "电流/A";//纵坐标
panel.Y2Axis.Title.Text = "电压/V";//纵坐标2
panel.Y2Axis.IsVisible = true;//纵坐标2显示使能
panel.Title.FontSpec.Family = "Arial";//标题字体样式
panel.Title.FontSpec.Size = 26;//标题字体大小
panel.Title.FontSpec.IsBold = true;//标题字体粗体显示
zgc.PanModifierKeys = Keys.Shift;//想用鼠标拖动坐标轴的话得按住shift
zgc.IsEnableHPan = true; // 鼠标拖动时允许横向移动
zgc.IsEnableVPan = true; // 鼠标拖动时允许纵向移动
zgc.IsShowContextMenu = true;//鼠标右键菜单
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;//上x轴大刻度禁止显示
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;//上x轴小刻度禁止显示
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
zgc.IsEnableVZoom = true; // 纵轴允许缩放
zgc.IsEnableHZoom = true; // 横轴允许缩放
zgc.ZoomStepFraction = 0.03; // 缩放速度
zgc.IsShowCursorValues = true;
panel.YAxis.Scale.BaseTic = 0; // 纵坐标轴的起点从零开始
panel.Y2Axis.Scale.BaseTic = 0; // 纵2坐标轴的起点从零开始
panel.YAxis.Scale.Min = 0;//纵坐标最小值为0
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
panel.Y2Axis.Scale.Min = 0;///纵坐标2最小值为0
panel.Y2Axis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴2的最大值
panel.XAxis.Scale.MinAuto = false; // 根据数据自动匹配横坐标轴的最小值
panel.XAxis.Scale.MaxAuto = true; // 根据数据自动匹配横坐标轴的最大值
panel.XAxis.Scale.IsVisible = true; // 允许显示x轴刻度值
panel.XAxis.Scale.MajorStepAuto = true;//大刻度自动匹配
panel.XAxis.Scale.MinorStepAuto = true;//小刻度自动匹配
panel.Fill = new Fill(Color.Yellow, Color.Pink, 45.0f); // 从左上角45.0°开始,从黄色过渡到粉色
zgc.IsShowPointValues = true;//鼠标移动到某个点时显示该点坐标
zgc.IsZoomOnMouseCenter = true;//以鼠标为中心进行放大
Double[] szy = new Double[dataGridView1.RowCount];//Y轴的数据数组
string[] dates0 = new string[dataGridView1.RowCount];//制作string类型数组,这个数组存的是数据库最近保存的数据的时间信息
for (int i = 0; i < count; i++)//i表示行标
{
listAmp.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()));
listFreq.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()) + 1000);
szy[i] = Convert.ToDouble(dataGridView1[3,i].Value.ToString());
dates0[i] = dataGridView1[0,i].Value == null ? "" : dataGridView1[0,i].Value.ToString();
}
panel.XAxis.Type = AxisType.Text;//x轴选择为日期格式
panel.XAxis.Scale.TextLabels = dates0;//数据显示格式为分秒
zgc.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标
Refresh(); // 把变化后的点集显示在图里
connection.Close();
}
else
{
if(Convert.ToInt32(comboBox3.Text)>Convert.ToInt32(comboBox9.Text))
{
MessageBox.Show("日期时间顺序错误!请重新确立!");
}
else if (Convert.ToInt32(comboBox3.Text) < Convert.ToInt32(comboBox9.Text))
{
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string strSQL = "select * from Table_1 where 时间>='" + comboBox1.Text + "-" + comboBox2.Text + "-" + comboBox3.Text + " " + comboBox4.Text + ":" + comboBox5.Text + ":" + comboBox6.Text + "' and 时间<='" + comboBox7.Text + "-" + comboBox8.Text + "-" + comboBox9.Text + " " + comboBox10.Text + ":" + comboBox11.Text + ":" + comboBox12.Text + "'";
SqlCommand comm = new SqlCommand(strSQL, connection);
//new Form4().Show();
SqlDataAdapter da = new SqlDataAdapter(strSQL, connection);
DataSet ds = new DataSet();
da.Fill(ds, "Table_1");
dataGridView1.DataSource = ds.Tables["Table_1"];
SqlDataAdapter dant = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dant.Fill(dt);
int count = dt.Rows.Count;
//曲线
GraphPane panel = zgc.GraphPane;//控件声明
PointPairList listAmp = new PointPairList();//电压曲线声明
PointPairList listFreq = new PointPairList();//电流曲线声明
LineItem cureAmp = panel.AddCurve("电压", listAmp, Color.Red, SymbolType.None);//电压曲线规格赋值
LineItem cureFreq = panel.AddCurve("电流", listFreq, Color.Blue, SymbolType.None);//电流曲线规格赋值
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
//cureFreq.
panel.Title.Text = "电压电流实时曲线";//标题
panel.XAxis.Title.Text = "时间/s";//横坐标
panel.YAxis.Title.Text = "电流/A";//纵坐标
panel.Y2Axis.Title.Text = "电压/V";//纵坐标2
panel.Y2Axis.IsVisible = true;//纵坐标2显示使能
panel.Title.FontSpec.Family = "Arial";//标题字体样式
panel.Title.FontSpec.Size = 26;//标题字体大小
panel.Title.FontSpec.IsBold = true;//标题字体粗体显示
zgc.PanModifierKeys = Keys.Shift;//想用鼠标拖动坐标轴的话得按住shift
zgc.IsEnableHPan = true; // 鼠标拖动时允许横向移动
zgc.IsEnableVPan = true; // 鼠标拖动时允许纵向移动
zgc.IsShowContextMenu = true;//鼠标右键菜单
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;//上x轴大刻度禁止显示
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;//上x轴小刻度禁止显示
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
zgc.IsEnableVZoom = true; // 纵轴允许缩放
zgc.IsEnableHZoom = true; // 横轴允许缩放
zgc.ZoomStepFraction = 0.03; // 缩放速度
zgc.IsShowCursorValues = true;
panel.YAxis.Scale.BaseTic = 0; // 纵坐标轴的起点从零开始
panel.Y2Axis.Scale.BaseTic = 0; // 纵2坐标轴的起点从零开始
panel.YAxis.Scale.Min = 0;//纵坐标最小值为0
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
panel.Y2Axis.Scale.Min = 0;///纵坐标2最小值为0
panel.Y2Axis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴2的最大值
panel.XAxis.Scale.MinAuto = false; // 根据数据自动匹配横坐标轴的最小值
panel.XAxis.Scale.MaxAuto = true; // 根据数据自动匹配横坐标轴的最大值
panel.XAxis.Scale.IsVisible = true; // 允许显示x轴刻度值
panel.XAxis.Scale.MajorStepAuto = true;//大刻度自动匹配
panel.XAxis.Scale.MinorStepAuto = true;//小刻度自动匹配
panel.Fill = new Fill(Color.Yellow, Color.Pink, 45.0f); // 从左上角45.0°开始,从黄色过渡到粉色
zgc.IsShowPointValues = true;//鼠标移动到某个点时显示该点坐标
zgc.IsZoomOnMouseCenter = true;//以鼠标为中心进行放大
Double[] szy = new Double[dataGridView1.RowCount];//Y轴的数据数组
string[] dates0 = new string[dataGridView1.RowCount];//制作string类型数组,这个数组存的是数据库最近保存的数据的时间信息
for (int i = 0; i < count; i++)//i表示行标
{
listAmp.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()));
listFreq.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()) + 1000);
szy[i] = Convert.ToDouble(dataGridView1[3,i].Value.ToString());
dates0[i] = dataGridView1[0,i].Value == null ? "" : dataGridView1[0,i].Value.ToString();
}
panel.XAxis.Type = AxisType.Text;//x轴选择为日期格式
panel.XAxis.Scale.TextLabels = dates0;//数据显示格式为分秒
zgc.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标
Refresh(); // 把变化后的点集显示在图里
connection.Close();
}
else
{
if(Convert.ToInt32(comboBox4.Text)>Convert.ToInt32(comboBox10.Text))
{
MessageBox.Show("小时顺序错误!请重新确立!");
}
else if (Convert.ToInt32(comboBox4.Text) < Convert.ToInt32(comboBox10.Text))
{
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string strSQL = "select * from Table_1 where 时间>='" + comboBox1.Text + "-" + comboBox2.Text + "-" + comboBox3.Text + " " + comboBox4.Text + ":" + comboBox5.Text + ":" + comboBox6.Text + "' and 时间<='" + comboBox7.Text + "-" + comboBox8.Text + "-" + comboBox9.Text + " " + comboBox10.Text + ":" + comboBox11.Text + ":" + comboBox12.Text + "'";
SqlCommand comm = new SqlCommand(strSQL, connection);
//new Form4().Show();
SqlDataAdapter da = new SqlDataAdapter(strSQL, connection);
DataSet ds = new DataSet();
da.Fill(ds, "Table_1");
dataGridView1.DataSource = ds.Tables["Table_1"];
SqlDataAdapter dant = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dant.Fill(dt);
int count = dt.Rows.Count;
//曲线
GraphPane panel = zgc.GraphPane;//控件声明
PointPairList listAmp = new PointPairList();//电压曲线声明
PointPairList listFreq = new PointPairList();//电流曲线声明
LineItem cureAmp = panel.AddCurve("电压", listAmp, Color.Red, SymbolType.None);//电压曲线规格赋值
LineItem cureFreq = panel.AddCurve("电流", listFreq, Color.Blue, SymbolType.None);//电流曲线规格赋值
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
//cureFreq.
panel.Title.Text = "电压电流实时曲线";//标题
panel.XAxis.Title.Text = "时间/s";//横坐标
panel.YAxis.Title.Text = "电流/A";//纵坐标
panel.Y2Axis.Title.Text = "电压/V";//纵坐标2
panel.Y2Axis.IsVisible = true;//纵坐标2显示使能
panel.Title.FontSpec.Family = "Arial";//标题字体样式
panel.Title.FontSpec.Size = 26;//标题字体大小
panel.Title.FontSpec.IsBold = true;//标题字体粗体显示
zgc.PanModifierKeys = Keys.Shift;//想用鼠标拖动坐标轴的话得按住shift
zgc.IsEnableHPan = true; // 鼠标拖动时允许横向移动
zgc.IsEnableVPan = true; // 鼠标拖动时允许纵向移动
zgc.IsShowContextMenu = true;//鼠标右键菜单
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;//上x轴大刻度禁止显示
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;//上x轴小刻度禁止显示
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
zgc.IsEnableVZoom = true; // 纵轴允许缩放
zgc.IsEnableHZoom = true; // 横轴允许缩放
zgc.ZoomStepFraction = 0.03; // 缩放速度
zgc.IsShowCursorValues = true;
panel.YAxis.Scale.BaseTic = 0; // 纵坐标轴的起点从零开始
panel.Y2Axis.Scale.BaseTic = 0; // 纵2坐标轴的起点从零开始
panel.YAxis.Scale.Min = 0;//纵坐标最小值为0
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
panel.Y2Axis.Scale.Min = 0;///纵坐标2最小值为0
panel.Y2Axis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴2的最大值
panel.XAxis.Scale.MinAuto = false; // 根据数据自动匹配横坐标轴的最小值
panel.XAxis.Scale.MaxAuto = true; // 根据数据自动匹配横坐标轴的最大值
panel.XAxis.Scale.IsVisible = true; // 允许显示x轴刻度值
panel.XAxis.Scale.MajorStepAuto = true;//大刻度自动匹配
panel.XAxis.Scale.MinorStepAuto = true;//小刻度自动匹配
panel.Fill = new Fill(Color.Yellow, Color.Pink, 45.0f); // 从左上角45.0°开始,从黄色过渡到粉色
zgc.IsShowPointValues = true;//鼠标移动到某个点时显示该点坐标
zgc.IsZoomOnMouseCenter = true;//以鼠标为中心进行放大
Double[] szy = new Double[dataGridView1.RowCount];//Y轴的数据数组
string[] dates0 = new string[dataGridView1.RowCount];//制作string类型数组,这个数组存的是数据库最近保存的数据的时间信息
for (int i = 0; i < count; i++)//i表示行标
{
listAmp.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()));
listFreq.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()) + 1000);
szy[i] = Convert.ToDouble(dataGridView1[3,i].Value.ToString());
dates0[i] = dataGridView1[0,i].Value == null ? "" : dataGridView1[0,i].Value.ToString();
}
panel.XAxis.Type = AxisType.Text;//x轴选择为日期格式
panel.XAxis.Scale.TextLabels = dates0;//数据显示格式为分秒
zgc.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标
Refresh(); // 把变化后的点集显示在图里
connection.Close();
}
else
{
if (Convert.ToInt32(comboBox5.Text) > Convert.ToInt32(comboBox11.Text))
{
MessageBox.Show("分钟顺序错误!请重新确立!");
}
else if (Convert.ToInt32(comboBox5.Text) < Convert.ToInt32(comboBox11.Text))
{
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string strSQL = "select * from Table_1 where 时间>='" + comboBox1.Text + "-" + comboBox2.Text + "-" + comboBox3.Text + " " + comboBox4.Text + ":" + comboBox5.Text + ":" + comboBox6.Text + "' and 时间<='" + comboBox7.Text + "-" + comboBox8.Text + "-" + comboBox9.Text + " " + comboBox10.Text + ":" + comboBox11.Text + ":" + comboBox12.Text + "'";
SqlCommand comm = new SqlCommand(strSQL, connection);
//new Form4().Show();
SqlDataAdapter da = new SqlDataAdapter(strSQL, connection);
DataSet ds = new DataSet();
da.Fill(ds, "Table_1");
dataGridView1.DataSource = ds.Tables["Table_1"];
SqlDataAdapter dant = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dant.Fill(dt);
int count = dt.Rows.Count;
//曲线
GraphPane panel = zgc.GraphPane;//控件声明
PointPairList listAmp = new PointPairList();//电压曲线声明
PointPairList listFreq = new PointPairList();//电流曲线声明
LineItem cureAmp = panel.AddCurve("电压", listAmp, Color.Red, SymbolType.None);//电压曲线规格赋值
LineItem cureFreq = panel.AddCurve("电流", listFreq, Color.Blue, SymbolType.None);//电流曲线规格赋值
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
//cureFreq.
panel.Title.Text = "电压电流实时曲线";//标题
panel.XAxis.Title.Text = "时间/s";//横坐标
panel.YAxis.Title.Text = "电流/A";//纵坐标
panel.Y2Axis.Title.Text = "电压/V";//纵坐标2
panel.Y2Axis.IsVisible = true;//纵坐标2显示使能
panel.Title.FontSpec.Family = "Arial";//标题字体样式
panel.Title.FontSpec.Size = 26;//标题字体大小
panel.Title.FontSpec.IsBold = true;//标题字体粗体显示
zgc.PanModifierKeys = Keys.Shift;//想用鼠标拖动坐标轴的话得按住shift
zgc.IsEnableHPan = true; // 鼠标拖动时允许横向移动
zgc.IsEnableVPan = true; // 鼠标拖动时允许纵向移动
zgc.IsShowContextMenu = true;//鼠标右键菜单
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;//上x轴大刻度禁止显示
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;//上x轴小刻度禁止显示
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
zgc.IsEnableVZoom = true; // 纵轴允许缩放
zgc.IsEnableHZoom = true; // 横轴允许缩放
zgc.ZoomStepFraction = 0.03; // 缩放速度
zgc.IsShowCursorValues = true;
panel.YAxis.Scale.BaseTic = 0; // 纵坐标轴的起点从零开始
panel.Y2Axis.Scale.BaseTic = 0; // 纵2坐标轴的起点从零开始
panel.YAxis.Scale.Min = 0;//纵坐标最小值为0
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
panel.Y2Axis.Scale.Min = 0;///纵坐标2最小值为0
panel.Y2Axis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴2的最大值
panel.XAxis.Scale.MinAuto = false; // 根据数据自动匹配横坐标轴的最小值
panel.XAxis.Scale.MaxAuto = true; // 根据数据自动匹配横坐标轴的最大值
panel.XAxis.Scale.IsVisible = true; // 允许显示x轴刻度值
panel.XAxis.Scale.MajorStepAuto = true;//大刻度自动匹配
panel.XAxis.Scale.MinorStepAuto = true;//小刻度自动匹配
panel.Fill = new Fill(Color.Yellow, Color.Pink, 45.0f); // 从左上角45.0°开始,从黄色过渡到粉色
zgc.IsShowPointValues = true;//鼠标移动到某个点时显示该点坐标
zgc.IsZoomOnMouseCenter = true;//以鼠标为中心进行放大
Double[] szy = new Double[dataGridView1.RowCount];//Y轴的数据数组
string[] dates0 = new string[dataGridView1.RowCount];//制作string类型数组,这个数组存的是数据库最近保存的数据的时间信息
for (int i = 0; i < count; i++)//i表示行标
{
listAmp.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()));
listFreq.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()) + 1000);
szy[i] = Convert.ToDouble(dataGridView1[3,i].Value.ToString());
dates0[i] = dataGridView1[0,i].Value == null ? "" : dataGridView1[0,i].Value.ToString();
}
panel.XAxis.Type = AxisType.Text;//x轴选择为日期格式
panel.XAxis.Scale.TextLabels = dates0;//数据显示格式为分秒
zgc.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标
Refresh(); // 把变化后的点集显示在图里
connection.Close();
}
else
{
if(Convert.ToInt32(comboBox6.Text)>Convert.ToInt32(comboBox12.Text))
{
MessageBox.Show("秒钟顺序错误!请重新确立!");
}
else
{
SqlConnection connection = new SqlConnection();//新建连接对象
connection.ConnectionString = "Data Source=DESKTOP-F57AF5E;Initial Catalog=Record;Integrated Security=SSPI;";//给连接对象指定连接的参数(连接字符串)
connection.Open();
string strSQL = "select * from Table_1 where 时间>='" + comboBox1.Text + "-" + comboBox2.Text + "-" + comboBox3.Text + " " + comboBox4.Text + ":" + comboBox5.Text + ":" + comboBox6.Text + "' and 时间<='" + comboBox7.Text + "-" + comboBox8.Text + "-" + comboBox9.Text + " " + comboBox10.Text + ":" + comboBox11.Text + ":" + comboBox12.Text + "'";
SqlCommand comm = new SqlCommand(strSQL, connection);
//new Form4().Show();
SqlDataAdapter da = new SqlDataAdapter(strSQL, connection);
DataSet ds = new DataSet();
da.Fill(ds, "Table_1");
dataGridView1.DataSource = ds.Tables["Table_1"];
SqlDataAdapter dant = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dant.Fill(dt);
int count = dt.Rows.Count;
//曲线
GraphPane panel = zgc.GraphPane;//控件声明
PointPairList listAmp = new PointPairList();//电压曲线声明
PointPairList listFreq = new PointPairList();//电流曲线声明
LineItem cureAmp = panel.AddCurve("电压", listAmp, Color.Red, SymbolType.None);//电压曲线规格赋值
LineItem cureFreq = panel.AddCurve("电流", listFreq, Color.Blue, SymbolType.None);//电流曲线规格赋值
cureAmp.IsY2Axis = true; // 关联cureAmp曲线到右边的纵坐标轴
//cureFreq.
panel.Title.Text = "电压电流实时曲线";//标题
panel.XAxis.Title.Text = "时间/s";//横坐标
panel.YAxis.Title.Text = "电流/A";//纵坐标
panel.Y2Axis.Title.Text = "电压/V";//纵坐标2
panel.Y2Axis.IsVisible = true;//纵坐标2显示使能
panel.Title.FontSpec.Family = "Arial";//标题字体样式
panel.Title.FontSpec.Size = 26;//标题字体大小
panel.Title.FontSpec.IsBold = true;//标题字体粗体显示
zgc.PanModifierKeys = Keys.Shift;//想用鼠标拖动坐标轴的话得按住shift
zgc.IsEnableHPan = true; // 鼠标拖动时允许横向移动
zgc.IsEnableVPan = true; // 鼠标拖动时允许纵向移动
zgc.IsShowContextMenu = true;//鼠标右键菜单
zgc.GraphPane.XAxis.MajorTic.IsOpposite = false;//上x轴大刻度禁止显示
zgc.GraphPane.XAxis.MinorTic.IsOpposite = false;//上x轴小刻度禁止显示
zgc.GraphPane.XAxis.MajorGrid.IsVisible = true; // 显示大刻度对应的网格
zgc.GraphPane.XAxis.MinorGrid.IsVisible = true; // 显示小刻度对应的网格
panel.XAxis.MajorGrid.DashOn = 5f; // 网格为虚线,这句话是设置虚线中的实线部分长度
panel.XAxis.MajorGrid.DashOff = 2f; // 设置虚线中的空白部分长度
panel.XAxis.MajorGrid.PenWidth = 1.5f; // 设置虚线线宽
zgc.IsEnableVZoom = true; // 纵轴允许缩放
zgc.IsEnableHZoom = true; // 横轴允许缩放
zgc.ZoomStepFraction = 0.03; // 缩放速度
zgc.IsShowCursorValues = true;
panel.YAxis.Scale.BaseTic = 0; // 纵坐标轴的起点从零开始
panel.Y2Axis.Scale.BaseTic = 0; // 纵2坐标轴的起点从零开始
panel.YAxis.Scale.Min = 0;//纵坐标最小值为0
panel.YAxis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴的最大值
panel.Y2Axis.Scale.Min = 0;///纵坐标2最小值为0
panel.Y2Axis.Scale.MaxAuto = true; // 根据数据自动匹配纵坐标轴2的最大值
panel.XAxis.Scale.MinAuto = false; // 根据数据自动匹配横坐标轴的最小值
panel.XAxis.Scale.MaxAuto = true; // 根据数据自动匹配横坐标轴的最大值
panel.XAxis.Scale.IsVisible = true; // 允许显示x轴刻度值
panel.XAxis.Scale.MajorStepAuto = true;//大刻度自动匹配
panel.XAxis.Scale.MinorStepAuto = true;//小刻度自动匹配
panel.Fill = new Fill(Color.Yellow, Color.Pink, 45.0f); // 从左上角45.0°开始,从黄色过渡到粉色
zgc.IsShowPointValues = true;//鼠标移动到某个点时显示该点坐标
zgc.IsZoomOnMouseCenter = true;//以鼠标为中心进行放大
Double[] szy = new Double[dataGridView1.RowCount];//Y轴的数据数组
string[] dates0 = new string[dataGridView1.RowCount];//制作string类型数组,这个数组存的是数据库最近保存的数据的时间信息
for (int i = 0; i < count; i++)//i表示行标
{
listAmp.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()));
listFreq.Add(i, Convert.ToDouble(dataGridView1[3,i].Value.ToString()) + 1000);
szy[i] = Convert.ToDouble(dataGridView1[3,i].Value.ToString());
dates0[i] = dataGridView1[0,i].Value == null ? "" : dataGridView1[0,i].Value.ToString();
}
panel.XAxis.Type = AxisType.Text;//x轴选择为日期格式
panel.XAxis.Scale.TextLabels = dates0;//数据显示格式为分秒
zgc.AxisChange(); // 因为点增加,需要自动修改横轴最大值(前提是MaxAuto为true),所以需要更新坐标
Refresh(); // 把变化后的点集显示在图里
connection.Close();
//panel.CurveList.Clear();//清除这次的曲线
}
}
}
}
}
}
}
}
三.初步运行界面
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- java运算符
1.1算术运算符加减乘除 1.运算符:对常量或者变量进行操作/运算的符号 2.表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。 3.数学运算符: (1): 加法运算(2)-: 减法运算(3)*: 乘法运算 (4)/: 除法运算 被除数 除数 商(/: …...
2024/4/21 17:13:41 - 关于 Rocksdb 的 EnvWrapper 作用的小讨论
临下班前一位做引擎的小伙伴提了个小问题, Rocksdb 实现了非常多的Env backend 这一些backend 可以让用户根据自己需求创建不同 公共接口backend,来实现自己的文件操作或者公共线程池操作。 Env* env new rocksdb::HdfsEnv(FLAGS_hdfs) 问题是…...
2024/4/27 0:14:28 - 嵌入式Linux开发简介
目录一、嵌入式Linux开发有那些内容二、嵌入式Linux开发学习指南一、嵌入式Linux开发有那些内容 嵌入式:除了电脑之外,其他可以运行程序的设备都是嵌入式设备,所谓嵌入就是将CPU嵌入一个设备,让其具有运行程序的能力、计算能力&am…...
2024/4/20 13:47:01 - Codeforces Round #751 (Div. 2)
Codeforces Round #751 (Div. 2) 知识点整理: 题号知识点难度备注A字符串800B构造1100C数学1300DBFS,DP1900E分治,贪心,线段树2300F排序,贪心2700 A题 题意: 给你一个字符串s,把他拆成两个字…...
2024/4/21 17:45:34 - ES学习笔记及面试
1.ES核心存放的是哪些? 索引 2.如果ES实现了集群的话,ES会使用分片技术将单台服务器节点的索引文件, 分布式存放到多个不同的物理机器(节点)上 **3.什么是分片技术?**将数据拆分成多台节点进行存放 4.在ES分片技术中,分…...
2024/4/21 14:08:22 - [mongodb]mongodb简记
简介: MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 它和我们使用的关…...
2024/4/26 16:36:53 - java代码块
普通代码块 直接写在方法中的代码块 构造代码块 将代码块直接定义在类之中的代码块叫做构造块,构造块随着每一次的类对象实例化进行调用。并且构造块中的代码优先于构造方法中的代码先执行 构造方法的主要作用是进行类对象初始化操作使用的,如果有一…...
2024/4/25 23:48:16 - Flutter的生命周期
一、生命周期阶段 flutter生命周期大体上可以分为三个阶段:初始化、状态变化、销毁。 1、初始化阶段 对应执行构造方法和initState时候 2、状态变化阶段 开新的widget或者调用setState方法的时候 3、销毁阶段 deactivate 和 dispose 二、生命周期阶段执行的函…...
2024/4/21 17:45:32 - 软件工程应用与实践课程jieba分词小组——⑤代码分析
2021SCSDUSC 前几篇文章,我们分析了finalseg中的代码。 首先,我们先看一下jieba分词的工作流程(图片来自网络): jieba的三种分词模式及其进入条件: 这三种模式有一个共同点,第一步都是先构造D…...
2024/4/23 5:53:27 - spring 八股
spring 八股1.IOC的注入方式有哪些?2.BeanFactory与ApplicationContext?3.spring bean的作用域?4.bean的生命周期5.五 种不同方式的自动装配1.IOC的注入方式有哪些? 1.set注入 2.构造器注入 3.静态工厂的方法注入 静态工厂顾名…...
2024/4/25 2:59:17 - Centos 7.9 安装 mysql 8.0
第一步 下载 rpm Yum mysql 下载 选择对应版本,点击 Download 点击底部标记位置,跳过登录,直接下载 第二步 安装 rpm 下载后,我们需要运行命令安装下载的 rmp 文件,安装文件需要 root 权限,我们可以使用 …...
2024/4/21 17:45:28 - 浅析单调队列
单调队列 单调队列有两个性质: 1.队列中元素其对应在原列表中的位置为单调递增的。 2.队列中的元素为单调递增或单调递减。 单调队列不同于普通队列的操作是:单调队列可以同时从队首及队位弹出元素,从而维护队列单调性 那么熟悉stl的小…...
2024/4/25 15:51:45 - JavaScript程序设计(第3章)语言基础
1.数据类型 ECMAScript 有 6 种简单数据类型(也称为原始类型):Undefined(未定义)、Null(值为对象(而不是函数)或 null)、Boolean(布尔值)、Numbe…...
2024/4/21 2:55:30 - UNIAPP可视化设计工具 一键生成UNIAPP应用代码
转载(uniapp页面速成提效工具) uniapp uview ui 可视化,完全自由拖拽,一键生成flex代码网站: http://aicode.shagua.wiki/uni/index.html#/ 十大特性 1.可视化,自由拖拽,推导出flex布局,尽可能兼容多端(h5,微信小程序) 2.支持uviewui内置所有图标,也可以使用阿里图标库160万…...
2024/4/25 23:28:35 - 机器学习1-线性回归笔记
1、模型 ,xi为样本点,为模型参数,为模型预测值,yi为真实值,为真实值和预测值的差值 2、目标函数 线性回归假设条件:条件一:,条件二:独立…...
2024/4/30 11:45:43 - Pytorch库——pickle
一、简介 在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间 Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象并保存到磁…...
2024/4/26 22:09:02 - 算法入门C——977. 有序数组的平方
LeetCode刷题——算法学习计划(入门部分) 文章目录题目描述思路介绍我的第一次正确提交官方版本方法一:直接排序方法二:双指针方法三:双指针题目描述 思路介绍 这题有很多种解法,我采用的是最直接最低效的…...
2024/4/23 10:37:22 - atom的使用(常用插件和vue语法高亮)
对于atom的使用,也是一次偶然,之前一直使用sublime,对于sublime的一些快捷使用也是比较熟悉了,换了一家公司,公司都在使用atom,入乡随俗吧,也改玩atom。发现atom还是很不错,和sublime很像,很多package都很全,具体的一些介绍,大家可以自己慢慢看。现在给大家说一些常…...
2024/5/2 3:07:14 - MySQL 8.0
1. 修改用户密码 ALTER USER ‘native‘‘localhost‘ IDENTIFIED WITH mysql_native_password BY ‘new_password‘; 2. 修改 MySQL 认证方式 认证方式 可以按照下面红色字体操作更改 Mysql 默认认证方式 When running a PHP version before 7.1.16, or PHP 7.2 before 7…...
2024/4/20 0:16:58 - java8:stream特性详解,原来如此强大
首先谈谈Stream的概念以及Java为什么引入Stream Stream是JAVA8引入的重要特性之一,它是对数据源的一个封装,通过这个封装对象可以对数据源进行处理,Stream本身并不是数据存储容器,跟数据结构也没有直接关系。 为什么要引入Strea…...
2024/4/27 9:05:06
最新文章
- 1-36 双列集合
一 Map集合 1.存储特点(重点记忆:) 以键值对(KEY-VALUE)形式存储 2.特点: ①将键值对看做对象进行存储 ②KEY 不能重复,VALUE可以重复 ③每一对K-V都是意义对应的映射关系 3.拓展:Map集合是双列集合,由两个单列集合组成的 分析KEY和VALUE所在的是什么种类集合 ①KEY不…...
2024/5/3 23:05:35 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - pytorch3d、Detectron2编译安装
基础环境: python:3.6 ubuntu:18.04 pytorch:1.8 cuda:10.2 一、pytorch3d编译 官方指南 GitCode - 开发者的代码家园 注意:cuda11以下的版本,需要安装CUB libaray,cuda11以上的版…...
2024/4/30 22:48:32 - 【嵌入式开发 Linux 常用命令系列 4.3 -- git add 不 add untracked file】
请阅读【嵌入式开发学习必备专栏 】 文章目录 git add 不add untracked file git add 不add untracked file 如果你想要Git在执行git add .时不添加未跟踪的文件(untracked files),你可以使用以下命令: git add -u这个命令只会加…...
2024/4/30 3:18:10 - 产品推荐 | 中科亿海微推出亿迅®A8000金融FPGA加速卡
01、产品概述 亿迅A8000金融加速卡,是中科亿海微联合金融证券领域的战略合作伙伴北京睿智融科,将可编程逻辑芯片与金融行业深度结合,通过可编程逻辑芯片对交易行情加速解码,实现低至纳秒级的解码引擎,端到端的处理时延…...
2024/5/2 2:35:23 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/2 9:28:15 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57