基于工业以太网的过程采集与控制
一、实验目的
1. 通过研华ADAM5000/TCP , ADAM-6000相关模块,进行基于工业以网过程采集与控制,实现相关应用系统的模拟。
2. 熟悉Visual C++编程环境及相关界面的设置。
3. 熟悉ADAMTCP.DLL,了解相关函数。
二、实验器材
一台PC机,一台LABS-1003实验箱等。
三、实验原理和电路
1. I/O模块选择:
为了使用ADAM-6000模块来组成数据采集/控制系统,您需要选择合适的模块来实现现场信号到PC的传输。选择模块的时候通常需要考虑以下问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
:
系统中I/O信号的类型,模拟量,数字量,
需要的I/O的点数,
如何在现场放置模块,
系统中将会使用多少个I/O模块,
需要多少个HUB来连接这些模块,
每个I/O模块要求的电压范围是什么,
每个I/O模块需要什么样的隔离保护环境,
每个I/O的抗噪和传输距离的限制是什么,
选型引导:
I/O模块类适合的现场设备和操作 备注
型
数字量输选择开关,按钮,限位开关,断路器,输入模块能够采集开/关或通/入模块 电机启动器,继电器等 断信号
数字量输报警,控制继电器,风扇,电灯,阀输出开/关或通/断信号 出模块 门等
模拟量输热电偶,热电阻,温度/压力/负载/湿将连续的模拟信号转换成能够入模块 度/流量等传感器 被父设备采集的信号 模拟量输 模拟量阀门,激励器,图
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
记录仪,将主机的指令转换成模拟信号出模块 电机驱动器,模拟仪表。 给现场设备
表1 选型引导
2. 实验原理
1
LABS-1003实验系统不仅可以完成模拟量、开关量、脉冲量的数据采集与控制,还可以通过ADAM-6090(以太网摄像机 Optional)实现过程影像的采集与控制。
ADAM-5000/TCP是一种数据采集及控制系统,它能够通过多通道I/O模块进行数据采集和过程监控,为用户提供以太网DA&C系统解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,通过Modbus
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
ADAM-5000/TCP可以很容易的做到同HMI软件或者用户开发的支持该协议的应用程序的集成。
ADAM-6000系列产品是基于Ethernet的数据采集和控制模块,它们集数据采集和网络传输能力于一身。通过
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的以太网ADAM-6000模块可以实时的将来自传感器的数据发送到局域网/以太网结点上。
ADAM-6000模块具有10M/100M自适用网络能力,支持工业通用的Modbus/TCP协议,可以便捷的同网络控制器或内置了Modbus/TCP协议的HMI/SCADA软件连接使用。并且支持UDP协议,可以同时向8个以太网结点发送数据。研华还提供了DLL驱动程序,OPC服务器,以及Window配置工具。用户可以使用Window配置工具,通过Modbus/TCP
软件结合,配置DA&C系统,也可以使用DLL驱动程序或Modbus/TCP OPC服务器与HMI
驱动程序或ActiveX控件开发应用系统。
在ADMA-6000模块中还预置了智能数学函数来提升系统的性能。数字量输入模块提供了计数,总和函数;数字量输出模块提供了脉冲输出,继电器输出函数;模拟量输入模块提供了最大/最小/平均数据计算;模拟量输出模块提供了PID回路控制函数等。
LABS-1003相关模块有:
1、ADAM-5017 8通道模拟量输入模块
ADAM-5017是16位8通道模拟量差动输入模块,通道输入范围均可程控。输入量程包括:mV(?150mV,?500mV),V(?1V,?5V,?10V)及电流输入(?20mA,需要250Ω电阻)。该模块以工程单位向主机提供数据,对于工业测量和应用软件的控制非常有效,5017提供了3000Vdc光电隔离输入保护,防止由于过高的电压输入而造成模块和外围设备的损坏。另外,该模块使用带有有效过电压保护的模拟量多路转换器,这种有效的保护线路确保了即使在错误情况下仍能保持信号的保真度。这种模块在?15 V的输入范围下可承受70 Vp-p的电压波动。
2、ADAM-5024 4通道模拟量输出模块
ADAM-5024是4通道模拟量输出模块,它通过ADAM-5000系统模块的RS-485接口从主机接收其数字量输入,然后通过D/A转换器将数字量信号转换成模拟量信号。通过配置软件可定制斜率和启动电流,输出可配置成电流或电压。
3、ADAM-5055S 8通道隔离数字量输入输出,带LED显示
5055S提供了8通道全隔离型数字量输入输出通道。所有通道均提供2500Vrms的隔离,防止接地环流及电源浪涌对信号的干扰,并且带有LED显示,可以清楚的看到输入输出状态。
4、ADAM-6017 8通道模拟量输入模块,带2通道数字量输出
ADAM-6017是16位8通道差分输入模块,通道输入范围均可程控。输入量程包括:mV(?100mV,?500mV),V(?1V,?5V,?10V)及电流输入(?20mA,4-20mA)。以工程单位形式向主机发送数据(mV,V,mA)在模块的基本页面,有Normal Value/Maximum Value/Minimum Value/Channels To Average几个页面,在这些页面
2
中分别可以看到采集值/最大值/最小值/平均值;
在应用模拟量输入模块数据前,要进行量程设置和积分时间标定,输入数据将以指定量程的工程单位计算。
实验中,CH1与实验箱上第二个电压表对应,调节该电压表,可改变CH1的值。
所有的模拟量通道都能设定发出警报的上下限,一旦该通道的值超过上限或低于下限就能激发一数字量输出报警,
5、ADAM-6050 18通道通用数字量输出/输入模块
ADAM-6050具有12个数字量输入,6个输出通道,并且为以太网的无缝连接提供了10/100 Base_T接口。所有的输入通道都支持输入锁存功能以处理重要数据,同时每个输入通道也都可以作为1KHz的计数器。数字量输出为集电极开路输出,可用来控制固态继电器(SSR),进而控制加热器、泵及动力设备;数字量输入可用来监测限制、安全开关等信号。同时输出通道也可以作为脉冲输出发生器。
单击ADAM-6050显示如下的画面,可以看到模块的输入输出等设置的选项和按钮信息。
3
Location:标准的Modbus地址。
Type:输出/输入通道的数据类型,对于数字量输入/输出模块是“Bit”。 Value:输入/输出模块每个通道的当前状态,对于数字量输入/输出模块,它的值为“0”(关) 或 “1” (开)。
Description:描述具体模块的通道数和输入/输出类型。
实验中,DO2、DO1、DO0分别与实验箱上DO6、DO5、DO4对应,按下屏幕上按钮可控制相应输出;DI2、DI1、DI0分别与实验箱上DI5、DI6、DI4对应,屏幕上按钮与实验箱上按钮可相互控制。
选择其中的一个管脚可以进行工作模式的设定,有普通输出模式、计时输出模式和延时输出模式,同样,输入管脚也可以设定相应的输入模式 3. 实验电路
系统要求:
?主机 ?IBM PC兼容机486以上CPU,推荐Pentium系列。
4
?Microsoft 95/98/2000/NT 4.0(SP3 OR SP4)或更高版本
?至少32M RAM
?至少20可用硬盘
?VGA
?2X或更高速的CD-ROM
?鼠标
?10/100M网卡
?10/100M 以太网HUB
?两条RJ-45接头的网线
?电源:+10~+30VDC,推荐:24VDC
组网系统如下图所示:
图1 ADAM5000/TCP硬件配置
图2 ADAM6000硬件配置
四、实验内容及步骤:
,、实验内容:
熟悉ADAMTCP相关的头文件(ADAMTCP.h)和函数库,利用ADAM5000/TCP ,
ADAM-6000相关模块,通过ADAM以太网模块工具,进行基于工业以太网的过程采集与控制,模拟相关应用系统。
5
2、操作步骤:
1)熟悉ADAM以太网模块工具的使用,模拟进行各信息的采集与控制,并进行相关
的设定。
2)熟悉ADAM5000/TCP , ADAM6000相关模块的使用。 3)熟悉Visual C++编程环境及相关界面的设置。
4)熟悉ADAMTCP.DLL,了解相关函数。
5)按照相应流程编写应用程序。
以下示例为通过ADAM-6017模块进行的模拟量数据采集系统:
初始化设备IP
ID、名称等
把IP、ID、名称赋值
给对应变量
连接5000/TCP和ADAM6000 NO
YES
获得模拟量 模拟量采集控件
连接错误
显示模拟量
退出
6
界面如图所示,分别显示了取得数据的16进制数,10进制数和真实值。同时在相应的指示框里显示了模块的名称,设备号,动态连接库版本号。 五、实验总程序
#include "stdafx.h"
#include "6KReadAI.h"
#include "6KReadAIDlg.h"
//添加相关头文件
#include
#include "..\..\..\include\adamtcp.h" #define DeviceID 0x01 // 定义5000/TCP的设备ID
#define DEFAULT_PORT 502 // 定义Modbus/TCP的端口
int iConnectionTimeout=2000; //与ADAM-5000/TCP连接超时时间设置 int iSendTimeout=2000; //向ADAM-5000/TCP发送指令时间超时设置 int iReceiveTimeout=2000; //从ADAM-5000/TCP接收回应超时时间设置 #ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
//界面设置
/////////////////////////////////////////////////////////////////////////////
// CMy6KReadAIDlg dialog
CMy6KReadAIDlg::CMy6KReadAIDlg(CWnd* pParent /*=NULL*/)
7
: CDialog(CMy6KReadAIDlg::IDD, pParent) {
//{{AFX_DATA_INIT(CMy6KReadAIDlg)
m_strDeviceID = _T("");
m_strIPAddress = _T("");
m_strModuleName = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CMy6KReadAIDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy6KReadAIDlg)
DDX_Text(pDX, IDC_EDIT_DEVICEID, m_strDeviceID);
DDX_Text(pDX, IDC_EDIT_IPADDRESS, m_strIPAddress);
DDX_CBString(pDX, IDC_MODULENAME, m_strModuleName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMy6KReadAIDlg, CDialog)
//{{AFX_MSG_MAP(CMy6KReadAIDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(ID_EXIT, OnExit)
ON_BN_CLICKED(ID_ANALOGINPUT, OnAnaloginput)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy6KReadAIDlg message handlers
BOOL CMy6KReadAIDlg::OnInitDialog()
{
int iRetVal;
char szDump[80];
CDialog::OnInitDialog(); //自动初始化对话框
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// 添加别的初始化内容
m_strIPAddress="172.18.0.104"; //初始化IP地址
m_strModuleName="6017"; //初始化模块名称
m_strDeviceID="1"; //初始化设备ID
//给相应编辑框赋值
SetDlgItemText(IDC_EDIT_IPADDRESS,m_strIPAddress);
SetDlgItemText(IDC_MODULENAME,m_strModuleName);
SetDlgItemText(IDC_EDIT_DEVICEID,m_strDeviceID);
// 获取DLL版本
char szCh[20];
8
int iVersion;
iVersion=ADAMTCP_GetDLLVersion();
_ltoa( iVersion, szCh, 16 );
SetDlgItemText(IDC_EDIT_DLLVER, szCh);
//初始化使用DLL
iRetVal=ADAMTCP_Open();
if( iRetVal!=0 )
{
sprintf(szDump,"ADAMTCP_Open() Failure !!! code=%d\n",iRetVal);
MessageBox(szDump);
}
return TRUE;
}
//系统自动生成的有关最小化窗体的程序
void CMy6KReadAIDlg::OnPaint() {
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CMy6KReadAIDlg::OnQueryDragIcon() {
return (HCURSOR) m_hIcon;
}
void CMy6KReadAIDlg::OnExit() //添加退出按键响应
{
ADAMTCP_Close(); //释放资源空间
CDialog::OnOK();
}
void CMy6KReadAIDlg::OnAnaloginput() // 添加模拟量输入按键响应
{
CString strText,strTemp;
char szIPAddress[20];
9
int i,iRetVal, iChannel;
WORD wDeviceID;
WORD wModuleName;
WORD wGain[9];
char szDump[80];
WORD wHex[16];
double fValue[16];
GetDlgItemText(IDC_MODULENAME,strTemp); //把模块名称赋给strTemp
wModuleName=(WORD)atoi(strTemp); //把模块名称赋wModuleName
GetDlgItemText(IDC_EDIT_DEVICEID,strTemp); //把设备ID赋给strTemp
wDeviceID=atoi(strTemp); //把设备ID赋给wDeviceID
GetDlgItemText(IDC_EDIT_IPADDRESS,szIPAddress,20); //把5000/TCP的
//IP地址赋给szIPAddress
//连接5000/TCP
iRetVal=ADAMTCP_Connect(szIPAddress,DEFAULT_PORT,
iConnectionTimeout, iSendTimeout, iReceiveTimeout);
if( iRetVal<0 )
{
sprintf(szDump,"ADAMTCP_Connect() Failure !!! code=%d\n",iRetVal);
MessageBox(szDump);
return;
}
//获得各通道的模拟量
iChannel = 8;
wGain[0]=ADAMTCP_BI_10V;
wGain[1]=ADAMTCP_BI_10V;
wGain[2]=ADAMTCP_BI_10V;
wGain[3]=ADAMTCP_BI_10V;
wGain[4]=ADAMTCP_BI_10V;
wGain[5]=ADAMTCP_BI_10V;
wGain[6]=ADAMTCP_BI_10V;
wGain[7]=ADAMTCP_BI_10V;
wGain[8]=ADAMTCP_BI_10V;
//读取模拟量通道输入值
iRetVal=ADAMTCP_Read6KAI(szIPAddress, wModuleName, wDeviceID,
wGain, wHex, fValue);
if( iRetVal )
{
sprintf(szDump,"ADAMTCP_Read6KDIO() Failure !!! code=%d\n",iRetVal);
MessageBox(szDump);
ADAMTCP_Disconnect();
return;
}
//显示0至7通道的模拟量输入值
((CListBox*)GetDlgItem(IDC_LIST_AIVALUE))->ResetContent();
10
for(i=0; i Data:%04x(hex) Data:%05u(dec) Value:%5.3f", i,wHex[i],wHex[i],fValue[i]);
((CListBox*)GetDlgItem(IDC_LIST_AIVALUE))->InsertString( -1, strText );
}
//显示Averaging通道的模拟量输入值
strText.Format( "Averaging channel: -> Data:%04x(hex) Data:%05u(dec) Value:%5.3f", wHex[8],wHex[8],fValue[8]);
((CListBox*)GetDlgItem(IDC_LIST_AIVALUE))->InsertString( -1, strText );
//断开5000/TCP的连接
ADAMTCP_Disconnect();
}
11