import javanetInetAddress;
import javautilArrayList;
import javautilGregorianCalendar;
import javautilList;
import jpcapJpcapCaptor;
import jpcapJpcapSender;
import jpcapNetworkInterface;
import jpcappacketEthernetPacket;
import jpcappacketICMPPacket;
import jpcappacketIPPacket;
public class JPing {
private NetworkInterface[] devices = JpcapCaptorgetDeviceList();
private JpcapSender sender;
private JpcapCaptor jpcap;
private ICMPPacket icmpPacket;
private List<String> listResult = new ArrayList<String>();
/
组织ICMP报文发送,并开启线程接收报文
@param ip
/
public void ping(String ip) {
try {
jpcap = JpcapCaptoropenDevice(devices[0], 200, false, 20);
sender = jpcapgetJpcapSenderInstance();
jpcapsetFilter("icmp", true);// 过滤器,只接受ICMP报文
icmpPacket = new ICMPPacket();
icmpPackettype = ICMPPacketICMP_ECHO; // 发送回显请求报文
icmpPacketsetIPv4Parameter(0, false, false, false, 0, false,
false, false, 0, 1010101, 100, IPPacketIPPROTO_ICMP,
devices[0]addresses[1]address, InetAddressgetByName(ip));
// 随意的32bytes数据
icmpPacketdata = "abcdefghijklmnopqrstuvwxyzabcdef"getBytes();
EthernetPacket ethernetPacket = new EthernetPacket();
ethernetPacketframetype = EthernetPacketETHERTYPE_IP;
ethernetPacketsrc_mac = devices[0]mac_address;
// 广播地址
ethernetPacketdst_mac = new byte[] { (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };
icmpPacketdatalink = ethernetPacket;
listResultadd("Pinging " + icmpPacketdst_ip + " with "
+ icmpPacketdatalength + " bytes of data: ");
startCapThread(jpcap);
for (int i = 0; i < 5; i++) {
icmpPacketsec = 0;
//icmpPacketusec = SystemcurrentTimeMillis();
icmpPacketusec = new GregorianCalendar()getTimeInMillis();// 记录发送时间
icmpPacketseq = (short) (1000 + i);
icmpPacketid = (short) (999 + i);
sendersendPacket(icmpPacket);
try {
Threadsleep(1000);
} catch (Exception e) {
eprintStackTrace();
}
}
} catch (Exception e) {
eprintStackTrace();
}
}
/
接收ICMP报文
@param jpcap
/
public void getIcmpPacket(JpcapCaptor jpcapCaptor) {
try {
while (true) {
long tmp = 0;
String tmpStr = null;
ICMPPacket rp;
rp = (ICMPPacket) jpcapCaptorgetPacket();
if ((rp != null) && (rpseq - rpid == 1)
&& (rptype == ICMPPacketICMP_ECHOREPLY)) {// 若是ICMP回应报文,则列出。。。
tmp = (rpsec 1000 + rpusec / 1000 - icmpPacketsec
1000 - icmpPacketusec); // 计算发送与接受的时间差
if (tmp <= 0)
tmpStr = " < 1 ms ";
else
tmpStr = "= " + tmp + " ms ";
Systemoutprintln("Reply from "
+ rpsrc_ipgetHostAddress() + ": bytes = "
+ rpdatalength + " time " + tmpStr + "TTL = "
+ rphop_limit);
listResultadd("Reply from " + rpsrc_ipgetHostAddress()
+ ": bytes = " + rpdatalength + " time " + tmpStr
+ "TTL = " + rphop_limit);
}
}
} catch (Exception e) {
eprintStackTrace();
}
}
/
接收ICMP报文
@param jpcap
/
public void startCapThread(final JpcapCaptor jpcap) {
Runnable runner = new Runnable() {
public void run() {
getIcmpPacket(jpcap);
}
};
new Thread(runner)start();
}
public static void main(String[] args) {
new JPing()ping(">//顺序栈
#include<stdioh>
#include<stdlibh>
#include<malloch>
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct
{
int base;
int top;
int stacksize;
}SqStack;
typedef int ElemType;
int InitStack(SqStack &S) //为栈S分配存储空间,并置S为空栈
{
int size = STACK_INIT_SIZE;
Sbase=(int )malloc(sizesizeof(ElemType));
if(!Sbase)
return 0;
Stop=Sbase; //置栈S为空栈
Sstacksize=STACK_INIT_SIZE;
return 1;
}
int GetTop(SqStack S,int &e) //若栈不空,则用e返回S的栈顶元素
{
if(Stop==Sbase) return 0;
e=(Stop-1);
return 1;
}
int Push(SqStack &S, int e) /进栈函数,将e插入栈S中,并使之成为栈顶元素/
{ if(Stop-Sbase>=Sstacksize) /栈满,追加存储空间/
{
int stackinvrement = STACKINCREMENT;
Sbase=(ElemType ) realloc(Sbase,(Sstacksize+stackinvrement)sizeof(ElemType));
if(!Sbase)
return 0; /存储分配失败/
Sstacksize+=STACKINCREMENT;
}
Stop++=e;
return 1;
}
int Pop(SqStack &S,int &e)/出栈函数,若栈S不空,则删除S的栈顶元素,用e返回其值/
{ if(Stop==Sbase) return 0;
e=--Stop;
return 1;
}
void OutputStack(SqStack &S)
{int q;
q=Stop-1;
for(int i=0;i<Stop-Sbase;i++)
{
printf("%3d ",q);q--;}
}
void main()
{
int a,b,c ;
char m;
SqStack s;
InitStack(s);
printf("请输入要进栈的元素个数是:");
scanf("%d",&a);
printf("\n请输入要进栈的%d个元素:",a);
for(b=0;b<a;b++) {
scanf("%d",&c);
Push(s,c); }
do { printf("\n");
printf(" 1输出栈的元素\n");
printf(" 2取栈顶元素\n");
printf(" 3删除栈顶元素\n");
printf(" 4退出程序\n");
printf("\n请选择一个字符:");
getchar();
scanf("%c",&m);
switch(m) {
case '1': printf("\n输出的栈为:");
OutputStack(s);
break;
case '2': GetTop(s,c);
printf("\n栈顶元素为:%d",c);
printf("\n输出的栈为:");
OutputStack(s);
break;
case '3': Pop(s,c);
printf("\n删除的栈顶元素:%d",c);
printf("\n输出的栈为:");
OutputStack(s);
printf("\n");
break;
case '4':break;
default: printf("输入的数字有错,请重新选择!\n"); break;
}
}while(m!='4');
}
//链栈
#include<stdioh>
#include<stdlibh>
typedef struct SNode
{
int data;
struct SNode next;
}SNode,LinkStack;
LinkStack top;
LinkStack PushStack(LinkStack top,int x) //入栈
{
LinkStack s;
s=(LinkStack)malloc(sizeof(SNode));
s->data=x;
s->next=top;
top=s;
return top;
}
LinkStack PopStack(LinkStack top) //退栈
{
LinkStack p;
if(top!=NULL)
{
p=top;
top=top->next;
free(p);
printf("退栈已完成\n");
return top;
}
else printf("栈是空的,无法退栈!\n"); return 0;
}
int GetStackTop(LinkStack top) //取栈顶元素
{
return top->data;
}
bool IsEmpty()//bool取值false和true,是0和1的区别,bool只有一个字节,BOOL为int型,bool为布尔型
{
return top==NULL true:false;
}
void Print()
{
SNode p;
p=top;
if(IsEmpty())
{
printf("The stack is empty!\n");
return;
}
while(p)
{
printf("%d ", p->data);
p=p->next;
}
printf("\n");
}
void main()
{
int x,a,b;
char m;
do { printf("\n");
printf("###############链栈的基本 *** 作##################\n");
printf("××××××××1置空栈××××××××××\n");
printf("××××××××2进栈×××××××××××\n");
printf("××××××××3退栈×××××××××××\n");
printf("××××××××4取栈顶元素××××××××\n");
printf("××××××××5退出程序×××××××××\n");
printf("##############################################\n");
printf("\n请选择一个字符:");
scanf("%c",&m);
switch(m){
case '1':
top=NULL;
printf("\n栈已置空!");
break;
case '2':
printf("\n请输入要进栈的元素个数是:");
scanf("%d",&a);
printf("\n请输入要进栈的%d个元素:",a);
for(b=0;b<a;b++) {
scanf("%d",&x);
top=PushStack(top,x); }
printf("进栈已完成!\n");
printf("\n输出栈为:");
Print();
break;
case '3':
printf("\n *** 作之前的输出栈为:");
Print();
top=PopStack(top);
printf("\n *** 作过后的输出栈为:");
Print();
break;
case '4':
printf("\n输出栈为:");
Print();
if(top!=NULL)
printf("\n栈顶元素是:%d\n",GetStackTop(top));
else
printf("\n栈是空的,没有元素!");
break;
case '5':break;
default:
printf("\n输入的字符不对,请重新输入!");
break;
}
getchar();
}while(m!='5');
}PI服务器软件是用于现场生产数据的采集和存储;PI客户端软件提供对实时/历史数据的二次应用;接口软件实现现场不同控制系统和PI系统的连接。PI 服务器软件1 PI-UDSPI系统的基本包PI-UDS包括系统的网络管理、应用程序接口管理、事件管理、ODBC服务、以及Module Database(模块化数据库)等。这些应用程序以后台服务的方式运行。2 PI-SVRAPPPI-SVRAPP包括一系列的后台应用服务程序,如执行计算(PE)、报警服务、批处理服务、SQC顺序质量控制服务等。u 执行计算(PE)模块描述执行计算服务模块允许用户不必用高级语言来实施复杂的计算功能。该模块可允许用户生成计算公式,使用简单的代数算式,并将之存入库中多次使用。状态方程包的计算结果可以象PI系统任意一个工位号一样存入数据档案。状态方程包可以直接与用C或Fortran写成的外部功能连接。大多数PI系统都有状态方程包。实施/应用执行计算(PE)模块可使工程师进行诸如流体特性、过程单元模型等计算。PE也可写出数据表达式用以计算从仪表中不能立即得到而必需通过计算才可得到的值,如流量补偿,正确的温度等。u 报警服务模块描述报警服务模块可对PI系统中任何一个工位号进行报警条件设置,如:高限报警、低限报警、偏差报警或ROC(数值大小变化率)报警。这些报警可送到PI系统中的事件档案中,用户可以筛选和查看报警条件。实施/应用用户接受的报警是那些已设置报警条件的工位号,在超过了最大值、最小值、ROC值或数据源没有发送数据时就会报警。这些报警消息有助于用户解决引起报警的原因。PI系统能够在服务器端敏感地探觉报警条件并通过触发一个动作来响应,如启动一个应用或给用户发送一个E-Mail(电子邮件)。u 批处理模块描述批处理模块是以一个批量前后关系来存储和读取PI系统的数据,而不是单纯以时间轴为依据。批量记录建立时,包括一些批量信息,如:批量记录数、批量标识、产品标识和单元名称等,查询功能将允许用户对感兴趣的批量进行查询。PI批处理模块也支持单元别名,例如,用户可指定一个画面显示温度、压力、组分,PI系统依据别名选定的适合的物理工位号并从相应的时间序列的批量里读取数据。实施/应用批处理模块正在许多工业的批量应用中得到应用。如:有一定顺序步骤的应用,炉子的开和停。在这类应用中,用户可决定是否启动这一顺序步骤。u SQC顺序质量控制模块描述顺序质量控制模块SQC是辨别随机波动和过程变化的一门技术。这些技术可作为过程优化的一种方法,如:设定目标、限额、产品限制等。在很多工业领域,SQC的实施已取得了很大的经济效益。但是,由于在实施过程中涉及到大量的数据及众多复杂计算和趋势分析,因而使该应用受到了很大的限制。顺序质量控制模块可在指定的时间周期里,对大量的采集样本进行在线计算,并把这些运算结果及相应的控制限、报警状态存入PI数据库。实施/应用顺序质量控制模块所能进行的SQC计算包括:平均值、移动平均值、几何图形平均值、极差、标准偏差、移动标准偏差、不合格品百分比、不合格品数量、缺陷数、单元累积缺陷数等。3 PI-DSPI-DS(Data Archive)是PI系统的数据存储模块。数据档案是OSIsoft软件公司时间序列的数据库,其中包括装置的过程信息、压力、流量、温度、设定点、开/关等数据的存储。通过PI快照功能(Snapshot),用户及其应用可以从数据源得到大多数最近的数据值。PI 客户软件模块OSIsoft软件公司基于微软平台的客户端软件工具使用户很方便地以不同格式从PI里读取数据。这些工具使不同的用户在相同数据库里看到各自关心的信息。每个人都有各自的画面、报告和分析功能,以满足不同需要,以下是一些主要的客户端软件介绍。1PI-Process Book(PI-PB)描述Process Book是一个图形用户界面接口,用户可建立各类画面,包括:趋势图、图素、值、棒图和其他动态图形。Process Book目的是让电厂的每一个人员在自己的桌面以一本书的方式建立起自己的生产运行和管理画面。实施/应用Process Book是PI系统中两个主要的用户界面软件之一,用户可决定如何建立自己的书,标记章节用于划分过程段,热键按钮用于入画面或激活其他应用。Process Book支持ODBC、ActiveX、VBA等微软最新的技术。2PI-Datalink (PI-PC)描述Datalink在PI系统和常用的微软的电子表格(Excel)之间提供生产数据的动态连接。它是在电子表格端通过在菜单条和对话框上使用“加入”功能实现的。用户能很方便、快捷的用PI系统的实时和历史数据填充电子表格,而不需要复杂的“导入”功能。实施/应用PI-Datalink是PI系统中第二个主要的用户界面软件,工厂里每个人都可用PI-Datalink和电子表格做数据分析和生成报告。可把工作单存起来,作为一个平台。以后把它读出来后,只要在单元日期上改动日期,工作单上的数据就会自动改变。除原始数据外,还可读出经过PI系统二次计算处理过的分析数据。3PI应用程序开发接口(PI-API/SDK)描述PI 应用程序开发接口提供一个通用的程序接口访问PI系统中的数据。API/SDK给用户提供了一个自己编程访问PI系统信息的路径。实施/应用OSI公司目前提供使用API函数的平台有:Microsoft Windows、Windows NT在Intel和AXP、HP-UX、IBM AIX 、SUN Solaris、DEC 的Alpha Unix平台。API 是一组可以调用PI数据库的函数,用户可用它写应用程序,读或写PI数据库。很多用户应用API把数据送入已有的应用中去,比如:性能监视或数据整合。目前,API/SDK的很多应用是在MS-Windows下与Visual Basic一起建立交互的客户端画面。4ODBC客户端(PI-ODBC-PC)描述PI-ODBC-PC允许用户使用标准的ANSI SQL调用,即使用ODBC访问PI数据库。实施/应用PI-ODBC-PC是客户端应用调用PI服务器中的SQL模块。它使用用户熟悉的读取关系数据库中数据的方法来读取PI中的数据。任何依从SQL调用的客户端均可以使用PI-ODBC-PC,它能使使用MIS系统的人穿透式读取过程数据而不用复制数据。5PI批处理客户端(PI-BAV)描述PI 批处理客户端允许依据批量的相应关系查看PI中的数据。ProcessBook以及其他的用户开发应用中都可以支持批处理控件的功能。6PI SQL Charts(PI-SQL)描述PI SQL是客户端的一个应用,它允许用户在ProcessBook内查看PI SQL的计算。7PI Profile Displays(PI-PRD)描述PI Profile Displays是一个客户端的应用,它允许用户以概括形式,诸如Cross-Direction,Machine Direction,平面图和三维映射查看PI的数据,具有同时显示多个扫描信息的能力。8PI ActiveView描述PI ActiveView是一个WEB客户端的应用,它允许用户将ProcessBook中生成的画面在通用的浏览器中进行发布。PI 接口软件OSIsoft软件公司作为独立的第三方软件供应商,目前可以提供多达300多种和不同控制系统的接口,包括所有主流DCS厂家、不同PLC厂家、LIMS厂家不同时期产品的标准接口。此外,PI系统还提供支持工业标准的数据通讯接口,如OPC、Modbus等等。PI系统的接口一般都通过PI API节点机来实现,节点机的主要工作是作为一个数据源的扫描节点。节点机有数据缓存的功能,即在主接点PI服务器与节点机之间因软件、硬件升级等原因引起离线时,节点机可把采集的现场数据暂存起来,等到主节点PI服务器恢复正常运行后,再把缓存队列中数据传送到PI服务器数据库中,从而不丢失采集的数据。提示: 使用FixGetUserInfo VBA 方法
示例:
在画面中插入一个Microsoft Text Box,允许iFIX的安全系统,然后运行如下VBA命令,
Dim sUserID As String
Dim sUserName As String
Dim sGroupName As String
SystemFixGetUserInfo sUserID, sUserName, sGroupName
TextBox1Text = sUserName
TextBox2Text = sGroupName
如要用iFIX的DATALINK显示此信息,则需定义一个全局变量,然后将用户信息赋予此全局变量,再将全局变量的值动态连接到iFIX的DATALINK,这样在每幅画面上均可显示此信息。
怎样使用按钮进行用户登录
提示: 使用iFIX 的LOGIN 程序
示例:
在画面中插入一个按钮,按钮后加入如下VBA命令:
Dim strPath As String
strPath = SystemBasePath
//此 shell 函数将运行可执行文件Loginexe
Shell strPath & "Loginexe -m", 1你只要取多行是不?
我给你一段代码参考
while (OCIStmtFetch(env->stmthp, env->errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)
{
count = data->num_column;
DataLink = (CHECK_DATA ) malloc(sizeof(CHECK_DATA));
len = 0;
if(data->num_column > 1)
{
while (count--)
{
sprintf(&((DataLink->buf)[len]), "%s%c", data->buf[count],'$');
len += strlen(data->buf[count])+1;
}
}
else
sprintf(DataLink->buf, "%s", data->buf[0]);
DataLink->next = NULL;
DataLink->next = head->next;
head->next = DataLink;
data->num_row++;
}
这个就是循环取数据
只是我这里用了链表 和把多个字段合成一个字段存入到了链表 取出来用的时候再把多个字段分离
这个fetch 函数的参数 OCI_FETCH_NEXT, 表示一次 取一条数据 不管你有多少列 一次取一条记录 具体列数通过它返回的结构体力的num_column取得/
另外你所说的批量插入是啥意思 我后台程序 每30秒插入一次数据一次插入4096条,貌似没有什么批量的概念。我不懂你的意思 我给你我插入数据的代码demo
int oci_excu(OCI_ENV env,text sql,int flag)
{
/ OCIStmtPrepare() 解析SQL语句 /
if(OCIStmtPrepare(env->stmthp, env->errhp, sql, (ub4)strlen((char )sql), OCI_NTV_SYNTAX, OCI_DEFAULT))
return 0;
/ OCIStmtExecute() 执行SQL语句 /
if(OCIStmtExecute(env->svchp, env->stmthp, env->errhp, (ub4) 1, (ub4) 0,(CONST OCISnapshot ) NULL,(OCISnapshot ) NULL, OCI_DEFAULT | OCI_COMMIT_ON_SUCCESS))
return 0;
/ OCITransCommit() 进行事务的提交,不提交回滚 /
if(flag)
{
if(OCITransCommit(env->svchp,env->errhp,(ub4)0))
return 0;
}
return 1;
}
if (distance > 00001)
{
sprintf(tName,"GPS_%d_Y",tf[k]); // 数据库表名
InsertHash(temp, pHash, MAX_REC<<2); // 插入
if(interval == 0 || interval > 420)
node = 1;
else
node = 0;
sprintf(sql,"insert into %s (id,tm_id,lon,lat, speed,utc_time,udate,mileage,DIRECTION,DISTANCE,INTERVAL,node,term_stat,RESERVE,reserve1) values (seq_gpsnextVal,'%s','%f','%f','%f','%d','%d','%f','%d','%f','%d','%d','%d','%s','%s')",
tName,GpsRec[i]tid,GpsRec[i]lon,GpsRec[i]lat,GpsRec[i]speed,GpsRec[i]utime,GpsRec[i]udate,GpsRec[i]mileage,GpsRec[i]dir,distance,interval,node,GpsRec[i]stat,GpsRec[i]alltime,dirc[GpsRec[i]dir]);
// printf("%s\n",sql);
sem_wait(&sem_or); // 挂起信号
oci_excu(oracle_env,(text )sql,0); // 插入数据
sem_post(&sem_or); // 信号解锁
memset(tName,0x00,10);
}
循环插入数据即可 你所指批量莫非就是这个意思? 另外OCIDefineByPos 这个函数的介绍随便百度下好像都解释的很清楚了 你不明白的地方是哪里??
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)