当前位置: 首页 新闻详细

jdbc是什么,让PLC数据飞到数据库中

专业互联网培训机构——完成蜕变以后轻松拿高薪

电话+V:159999-78052 ,欢迎咨询程序中使用数据库的数据代码是什么形式,[python实用课程],[C++单片机原理],[C#、PHP网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]

一、jdbc是什么

JDBC是Java语言中用于连接数据库的一种规范。它提供了一种标准的API接口,使得Java应用程序能够与各种关系数据库进行交互操作。通过JDBC,开发者可以使用Java编写代码来访问和操作数据库中的数据。JDBC是一种桥接器,实现了Java应用程序与数据库之间的通信。

JDBC的核心功能包括:

一、连接数据库

JDBC能够建立与数据库的连接,通过提供数据库的URL、用户名和密码等信息,实现Java应用程序与数据库服务器的通信。一旦连接建立成功,应用程序就可以通过JDBCAPI执行SQL语句来操作数据库。

二、执行SQL语句

JDBC提供了执行SQL语句的接口,包括查询、插入、更新和删除等操作。开发者可以通过JDBCAPI编写SQL语句,并通过连接对象执行这些语句,实现对数据库的增删改查操作。

三、处理结果集

当执行查询语句后,JDBC会返回结果集。结果集是一个表格形式的数据结构,包含了查询结果。开发者可以通过JDBC提供的接口来遍历结果集,获取和操作表中的每一行数据。

JDBC是一种重要的Java技术,广泛应用于数据库编程领域。它提供了一种标准化的方式,使得开发者能够方便地使用Java语言来连接和操作各种关系数据库。通过使用JDBC,开发者可以更加高效地编写数据库相关的应用程序,提高开发效率和数据访问的可靠性。

二、数据库文件怎么才能在程序中被使用

件数据库

文件数据库又叫嵌入式数据库,将整个数据库的内容保存在单个索引文件中,以便于数据库的发布。

文件数据库的3个重要特征(相对于传统数据库)

1.数据操作接口

SQL92标准,不管是传统数据库,还是文件数据库,都必须支持SQL92标准。

2.数据保存格式

传统数据库(DB2,Oracle,SQLserver等)数据保存的方式各异。

文件数据库将数据保存在单一文件中。

3.API支持

传统数据库都支持ODBC和JDBC。

某些文件数据库不支持ODBC和JDBC(sqlite都不支持,BerkeleyDB有ODBC和JDBC支持,Firdbird有第三方的ODBC驱动)。

文件数据库与传统数据库的比较

优势:由于数据保存在单一文件中,数据库的部署和发布都比较简单,适用于内嵌在应用程序中。

数据量不是太大时,速度比传统数据库要快。

缺点:由于数据保存在单一文件中,数据库打开时,该文件会被整个load到内存,应此数据库不能过大(100M以内,个人测试)。

各种文件数据库的比较

Sqlite:老牌的文件数据库,完全免费(publicdomain),使用方便,无须任何配置,下载源代码编译成库或者直接编译到应用程序都可以(250K,C代码)。支持事务机制和blob数据类型。

BerkerleyDB:更老牌的文件数据库,最稳定的数据库,完全可以取代大部分传统client/server数据库的应用场合;支持xml(代价是30M硬盘空间)。缺点是配置和使用比较复杂,不太适合小项目。

Firbird:与sqlite比较类似,有C#支持。某些发布版本不能build,很久没有关注了。

Access:一般不考虑

Sqlite简单介绍

个人比较喜欢sqlite,使用最方便,唯一的准备工作是下载250K的源;而且作者很热心,有问必答。

以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容。2个重要结构体和5个主要函数:

sqlite3*pdb,数据库句柄,跟文件句柄FILE很类似

sqlite3_stmt*stmt,这个相当于ODBC的Command对象,用于保存编译好的SQL语句

sqlite3_open(),打开数据库

sqlite3_exec(),执行非查询的sql语句

sqlite3_prepare(),准备sql语句,执行select语句或者要使用parameterbind时,用这个函数(封装了sqlite3_exec).

Sqlite3_step(),在调用sqlite3_prepare后,使用这个函数在记录集中移动。

Sqlite3_close(),关闭数据库文件

还有一系列的函数,用于从记录集字段中获取数据,如

sqlite3_column_text(),取text类型的数据。

sqlite3_column_blob(),取blob类型的数据

sqlite3_column_int(),取int类型的数据

让PLC数据飞到数据库中

2022-03-0207:20·剑指工控前言:

近年来。随着工业生产现场数据采集需求的增多,客户对于数据采集的方式也提出了多种要求。将PLC数据直接采集到数据库便是其中一种。

伟联科技WL-320E-M边缘计算模块支持对MySQL/SQLServer/Influxdb等数据库的增、删、查、改等基本操作。本文以MySQL为例介绍如何通过伟联科技边缘计算网关将PLC/仪表/DCS等现场生产设备的数据直接采集后存储到数据库中。这种采集和存储不会影响到生产现场PLC及SCADA系统。无需编写PLC程序和SCADA软件脚本。

MySQL数据库可以部署在边缘计算模块内,也可以位于局域网或云端。如果MySQL数据库不在边缘计算模块内部署,需要MySQL数据库开放局域网用户访问的权限。本文以MySQL8.0为例。

在边缘计算模块中,有专门用于连接MySQL数据库的节点,在边缘计算模块左侧节点选择区域内,找到存储分组,拖拽mysql节点到流程图上,双击配置mysql连接信息。本文中已经在局域网内192.168.2.47/24地址的计算机上安装好了MySQL数据库,并且对root用户配置了局域网设备访问的权限,直接连接即可。

边缘计算模块除了可以将内部数据写入到数据库外,还可以将外部读取回来的PLC数据写入到数据库,该功能可作为数据采集利器实现多远数据采集后依次写入到数据库中,便于后期查看和利用。

在PLC数据写入数据库之前,需要设计数据库表的存储格式,一般对于PLC数据来说,可以存储为行表格式或列表格式。

行表格式:以时间、标签名、标签值最为字段,每个标签及数值作为记录存储到数据库表中。如下:

列表格式:以时间、每个标签名为字段,每个标签及数值作为记录存储到数据库表中。如下:

用户可根据自己实际需要选择数据存储方式,两种方式在读取数据库时SQL语句不同,其余无实质差异。本文中以列表格式举例说明。

在名为wiscada的数据库中创建一个名为PLCData的表

createtablewiscada.PLCData(idbigintnotnullauto_increment,RecordTimedatetime,TestFloat_0real,TestFloat_1real,TestFloat_2real,TestFloat_3real,TestFloat_4real,primarykey(id))ENGINE=innodbdefaultcharset=utf8mb4;该语句意思为在wiscada数据库内创建名为PLCData的表,该表包含字段id(bigint数据类型,不允许空值,自动增加)、字段RecordTime(datetime类型,不允许空值)、字段TestFloat_0-TestFloat_4(real类型,不允许空值),另外该表的主键为字段id。

特别注意:本文中只创建了以上几个字段示例,更多的字段需要手动增加到创建表的语句中,在使用列表格式记录时,务必要提前规划好字段名称和字段数量,提前将使用到的字段都添加进去,后期增加会影响之前的数据记录。

也可以使用MySQLWorkbench软件通过图形化方式创建数据表。

执行完毕后可以看到已经创建了数据表

数据表创建完成后,可以使用边缘计算模块向该表内写数据。


本例中以RockwellL33ERM型号PLC为数据采集节点,将PLC内数据采集后插入到MySQL数据库中,实现连续稳定插入。

PLCIP地址为192.168.2.250/24,使用ethipin节点先将PLC内数据读取回来。

配置ETH-ipin节点读取数据,本文读取100个标签。

使用debug节点可以看到读取回来的数据

读回来的数据为对象类型,每一个PLC标签都是一个对象元素。

注意:在使用边缘计算模块向数据库内写数据的时候,需要注意写入的频率,这个频率一方面会影响到数据库的记录量,另一方面,太快的频率有可能会导致数据库响应缓慢。因此,需要使用一种方法控制写入数据库的节奏。

使用inject节点的周期性触发并输出自定义信号功能和function节点自定义JS函数的功能以及WiEdge系统内全局变量特性,配合起来可实现任意时间周期触发数据记录到数据库。

节点排布如下:

其中,读取PLC数据节点配置参考本文不在赘述。

写数据控制为inject节点,周期性输出方式,本文定义周期输出RecordStart字符串:


Function节点为整理接收的PLC数据为到SQL语句内,本文使用代码如下:

varCurTime//定义当前时间变量varstrSQL//定义变量//定义全局变量存储标签值,有多少向数据库写的标签就需要定义多少这种全局变量varTestFloat_0=context.get('TestFloat_0')varTestFloat_1=context.get('TestFloat_1')varTestFloat_2=context.get('TestFloat_2')varTestFloat_3=context.get('TestFloat_3')varTestFloat_4=context.get('TestFloat_4')//判断当前接受的消息是否是记录触发消息if(msg.payload=="RecordStart"){msg.payload=null;//如果是记录触发消息,则清除该消息,不返回任何结果RecordTag()//调用记录子函数returnmsg;//函数节点输出}else//如果接收的消息不是记录触发消息,为正常的数据,将消息传递给全局变量{TestFloat_0=msg.payload["TsetFloat[0]"];//获取上一节点读取到的标签值TestFloat_1=msg.payload["TsetFloat[1]"];//获取上一节点读取到的标签值TestFloat_2=msg.payload["TsetFloat[2]"];//获取上一节点读取到的标签值TestFloat_3=msg.payload["TsetFloat[3]"];//获取上一节点读取到的标签值TestFloat_4=msg.payload["TsetFloat[4]"];//获取上一节点读取到的标签值context.set('TestFloat_0',TestFloat_0)//将获取的消息传递给全局变量context.set('TestFloat_1',TestFloat_1)context.set('TestFloat_2',TestFloat_2)context.set('TestFloat_3',TestFloat_3)context.set('TestFloat_4',TestFloat_4)}//定义数据记录子函数functionRecordTag(){CurTime=getCurrentDate(2)//取精确到秒的日期时间strSQL="insertintoPLCData(RecordTime,TestFloat_0,TestFloat_1,TestFloat_2,TestFloat_3,TestFloat_4)values('"+CurTime+"',"+TestFloat_0+","+TestFloat_1+","+TestFloat_2+","+TestFloat_3+","+TestFloat_4+")"//举例SQL语句msg.payload=strSQL//将SQL语句返回给节点输出函数}functiongetCurrentDate(format)//获取当前日期时间函数{varnow=newDate();varyear=now.getFullYear();//得到年份varmonth=now.getMonth();//得到月份vardate=now.getDate();//得到日期varday=now.getDay();//得到周几varhour=now.getHours();//得到小时varminu=now.getMinutes();//得到分钟varsec=now.getSeconds();//得到秒month=month+1;if(month<10)month="0"+month;if(date<10)date="0"+date;if(hour<10)hour="0"+hour;if(minu<10)minu="0"+minu;if(sec<10)sec="0"+sec;vartime="";//精确到天if(format==1){time=year+"-"+month+"-"+date;}//精确到分elseif(format==2){time=year+"-"+month+"-"+date+""+hour+":"+minu+":"+sec;}returntime;}

传递SQL语句节点为change节点

最后为MySQL连接节点。

注意,读取其他PLC时,与本文类似,主要判断其他PLC节点读取后输出的结果类型。

在MySQL数据库里面查看写入的数据,本文以5秒周期记录PLC数据到数据库。

在实际使用中,需要估算数据库存储一定时间后占用计算机硬盘的大小,数据库本身会压缩数据,所以,以测试记录一定时间后查看实际占用硬盘的数据估算最为准确。

//以下代码在MySQL管理器里面运行即可,注意单引号类型,必须为英文格式


查看MySQL内数据库占用硬盘大小

SELECTCONCAT(TRUNCATE(SUM(data_length)/1024/1024,2),'MB')ASdata_size,CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB')ASmax_data_size,CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB')ASdata_free,CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB')ASindex_sizeFROMinformation_schema.tablesWHERETABLE_SCHEMA='wiscada'代码中,wiscada为MySQL数据库名

查看MySQL内某个表占用硬盘大小

//以下代码在MySQL管理器里面运行即可,注意单引号类型,必须为英文格式

SELECTCONCAT(TRUNCATE(SUM(data_length)/1024/1024,2),'MB')ASdata_size,CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB')ASmax_data_size,CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB')ASdata_free,CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB')ASindex_sizeFROMinformation_schema.tablesWHERETABLE_NAME='plcdata'代码中,plcdata为MySQL内数据库表名称

获取表或者数据库在一定时间内占用硬盘情况后,可计算机几年内总共会占用多少硬盘。


未完待续

【WINDRISES EMPLOYMENT PROGRAMMING】尊享对接老板

电话+V: 159999-78052

机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。

程序中使用数据库的数据代码是什么形式
发布人:rudeng96 发布时间:2024-10-15

友情链接