Progea Movicon:Movicon脚本编程入门.Tex.header_第1页
Progea Movicon:Movicon脚本编程入门.Tex.header_第2页
Progea Movicon:Movicon脚本编程入门.Tex.header_第3页
Progea Movicon:Movicon脚本编程入门.Tex.header_第4页
Progea Movicon:Movicon脚本编程入门.Tex.header_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ProgeaMovicon:Movicon脚本编程入门1ProgeaMovicon:Movicon脚本编程基础1.1了解Movicon软件环境Movicon是由Progea集团开发的一款先进的SCADA/HMI软件,用于工业自动化系统的监控和数据采集。它提供了一个集成的开发环境,允许用户创建复杂的图形界面,同时利用脚本编程来实现逻辑控制、数据处理和报警管理等功能。Movicon的脚本编程环境基于.NET框架,支持多种编程语言,包括C#和VB.NET。1.1.1软件环境组件图形编辑器:用于设计用户界面,包括各种控件和图形元素。项目管理器:管理项目结构,包括数据点、报警、趋势、脚本等。脚本编辑器:编写和调试脚本代码,支持语法高亮和错误检查。实时数据库:存储和管理项目中的数据点。通信管理器:连接到各种工业设备和系统,获取实时数据。1.2Movicon脚本编程语言概述Movicon支持使用C#和VB.NET进行脚本编程。这两种语言都是面向对象的编程语言,具有丰富的库和工具支持。在Movicon中,脚本主要用于以下场景:数据处理:例如,计算平均值、最大值或最小值。逻辑控制:根据条件执行不同的操作,如控制设备的启停。报警管理:定义报警条件,处理报警事件。用户界面交互:响应用户操作,更新界面状态。1.2.1C#示例:计算数据点的平均值//计算数据点的平均值

publicdoubleCalculateAverage(string[]dataPoints)

{

doublesum=0;

intcount=0;

foreach(stringdataPointindataPoints)

{

//获取数据点的值

doublevalue=(double)DataPointManager.GetValue(dataPoint);

if(!double.IsNaN(value))

{

sum+=value;

count++;

}

}

//防止除以零

if(count==0)

{

return0;

}

returnsum/count;

}1.2.2VB.NET示例:控制设备启停'控制设备启停

PublicSubControlDeviceStartStop(ByValdeviceIDAsString,ByValstartAsBoolean)

DimdeviceValueAsDouble=CDbl(DataPointManager.GetValue(deviceID))

IfstartThen

'设备启动

IfdeviceValue=0Then

DataPointManager.SetValue(deviceID,1)

EndIf

Else

'设备停止

IfdeviceValue=1Then

DataPointManager.SetValue(deviceID,0)

EndIf

EndIf

EndSub1.3脚本编程在Movicon中的应用脚本编程在Movicon中的应用广泛,可以增强系统的功能性和灵活性。以下是一些具体的应用场景:1.3.1数据处理计算:如上所述,可以编写脚本来计算数据点的平均值、最大值或最小值。转换:将数据点的值从一种格式转换为另一种,例如,将温度从摄氏度转换为华氏度。1.3.2逻辑控制条件判断:根据数据点的值执行不同的操作,如设备的启停控制。循环:对一系列数据点进行遍历,执行相同的操作。1.3.3报警管理定义报警条件:当数据点的值超出预设范围时触发报警。处理报警事件:编写脚本来响应报警事件,例如,发送电子邮件通知或记录报警日志。1.3.4用户界面交互响应用户操作:当用户点击按钮或选择菜单项时,执行相应的脚本。更新界面状态:根据数据点的值更新界面元素的状态,如显示设备的运行状态。通过脚本编程,Movicon用户可以定制和优化他们的SCADA/HMI系统,以满足特定的工业自动化需求。2设置和配置脚本环境2.1创建新的脚本项目在开始Movicon脚本编程之前,首先需要在Movicon环境中创建一个新的脚本项目。这一步骤确保了你的脚本代码有一个清晰的组织结构,并且可以与Movicon的其他组件(如画面、数据库、报警等)无缝集成。2.1.1步骤1:打开Movicon启动Movicon软件,确保你已经安装了最新版本的Movicon,以获得最佳的脚本编程体验。2.1.2步骤2:创建项目在Movicon主界面,选择“文件”>“新建”。在弹出的对话框中,输入你的项目名称,选择保存位置,然后点击“确定”。2.1.3步骤3:添加脚本组件在项目树中,找到“脚本”部分。右键点击“脚本”,选择“新建”>“脚本”。输入脚本名称,例如“示例脚本”,然后点击“确定”。2.2配置脚本编辑器Movicon的脚本编辑器是编写和调试脚本的主要工具。为了提高编程效率和代码质量,你需要对编辑器进行适当的配置。2.2.1步骤1:打开脚本编辑器在项目树中双击你刚刚创建的脚本,这将打开脚本编辑器。2.2.2步骤2:设置编辑器选项在脚本编辑器中,选择“工具”>“选项”。在“选项”对话框中,你可以设置代码自动完成、语法高亮、代码折叠等功能。例如,为了启用代码自动完成,勾选“代码自动完成”选项。为了改变字体大小,转到“字体和颜色”选项卡,选择“脚本编辑器”,然后调整字体大小。2.2.3步骤3:保存设置点击“确定”保存你的编辑器设置。2.3理解脚本工程结构Movicon脚本工程的结构对于管理代码和资源至关重要。了解这一结构可以帮助你更有效地组织和维护你的脚本项目。2.3.1脚本工程的主要组成部分脚本文件:这是你编写代码的地方。每个脚本文件可以包含多个函数和过程。库文件:用于存储可重用的代码片段,如函数库和类库。资源文件:包括图像、声音和其他多媒体资源,这些资源可以被脚本调用。2.3.2示例:创建一个简单的脚本'这是一个简单的示例脚本,用于演示如何在Movicon中编写脚本。

'它定义了一个函数,用于在控制台上打印一条消息。

PublicFunctionPrintMessage(ByValmessageAsString)AsBoolean

Console.WriteLine(message)

ReturnTrue

EndFunction在这个示例中,我们定义了一个名为PrintMessage的函数,它接受一个字符串参数message,并在控制台上打印这条消息。函数返回一个布尔值,表示操作是否成功。2.3.3脚本工程结构的重要性代码重用:通过将通用功能封装在库文件中,可以避免在多个脚本中重复编写相同的代码。模块化:将代码组织成多个脚本文件,每个文件负责一个特定的功能,可以提高代码的可读性和可维护性。资源管理:将多媒体资源存储在资源文件中,可以确保它们不会与代码混淆,同时也方便了资源的更新和替换。通过遵循这些步骤和理解脚本工程结构,你可以在Movicon中创建和管理复杂的脚本项目,提高你的编程效率和代码质量。3基本脚本编程概念3.1变量和数据类型在Movicon脚本编程中,变量是存储数据的容器,它们可以保存各种类型的信息,如数字、文本、布尔值等。Movicon支持多种数据类型,包括:整数(Integer):用于存储整数值。实数(Real):用于存储浮点数值。字符串(String):用于存储文本数据。布尔(Boolean):用于存储逻辑值,如真(True)或假(False)。3.1.1示例:变量声明与赋值//声明并初始化变量

Integeri=10;

Realr=3.14;

Strings="Hello,Movicon!";

Booleanb=True;

//变量赋值

i=20;

r=2.718;

s="Welcometoscripting!";

b=False;3.2控制结构:条件语句和循环控制结构允许脚本根据特定条件执行不同的代码路径,或重复执行一段代码直到满足某个条件。Movicon脚本支持以下控制结构:3.2.1条件语句If…Then…Else:根据条件执行不同的代码块。示例:使用If…Then…ElseIntegerx=5;

Integery=10;

if(x>y)then

//如果x大于y,执行以下代码

MsgBox("xisgreaterthany");

elseif(x<y)then

//如果x小于y,执行以下代码

MsgBox("xislessthany");

else

//如果x等于y,执行以下代码

MsgBox("xisequaltoy");

endif;3.2.2循环For…Next:重复执行代码块特定次数。While…Do…EndDo:只要条件为真,就重复执行代码块。示例:使用For…NextIntegersum=0;

forIntegeri=1to10do

//累加1到10的和

sum=sum+i;

endfor;

MsgBox("Thesumis:"+sum);示例:使用While…Do…EndDoIntegercount=1;

Integertotal=0;

while(count<=5)do

//累加1到5的和

total=total+count;

count=count+1;

endwhile;

MsgBox("Thetotalis:"+total);3.3函数和过程的定义与使用函数和过程是可重用的代码块,它们可以接受参数,执行特定任务,并返回结果(对于函数)。Movicon脚本支持定义和调用自定义函数和过程。3.3.1函数定义FunctionIntegerAdd(Integera,Integerb)

//函数体

returna+b;

endfunction;3.3.2过程定义ProcedurePrintHello(Stringname)

//过程体

MsgBox("Hello,"+name);

endprocedure;3.3.3示例:调用函数和过程Integerresult=Add(5,3);

PrintHello("World");

MsgBox("Resultofaddition:"+result);通过以上示例,您可以开始理解Movicon脚本编程的基本概念,包括变量、数据类型、控制结构以及函数和过程的定义与使用。这些是构建复杂脚本和应用程序的基础。4脚本与Movicon组件交互4.1与Movicon标签交互在Movicon中,标签是用于存储和检索数据的基本单元。通过脚本,我们可以读取和写入标签的值,实现数据的动态处理和控制。下面是一个示例,展示如何使用脚本读取和写入一个标签的值。4.1.1读取标签值'声明变量

DimTagValueAsVariant

'读取标签值

TagValue=GetTagValue("MyTag")

'输出标签值

MsgBox"标签值为:"&TagValue在这个例子中,我们首先声明了一个变量TagValue,然后使用GetTagValue函数读取名为MyTag的标签的值。最后,我们使用MsgBox函数显示读取到的标签值。4.1.2写入标签值'声明变量

DimNewTagValueAsVariant

'设置新值

NewTagValue=100

'写入标签值

SetTagValue("MyTag",NewTagValue)这里,我们首先设置NewTagValue变量为100,然后使用SetTagValue函数将这个新值写入MyTag标签。4.2控制Movicon图形对象Movicon的图形对象可以被脚本控制,以实现动态的图形界面。例如,我们可以改变一个图形对象的位置、大小、颜色,或者控制其可见性。4.2.1改变图形对象位置'声明变量

DimObjAsObject

'获取图形对象

SetObj=GetObject("MyObject")

'改变位置

Obj.Left=100

Obj.Top=200在这个例子中,我们首先使用GetObject函数获取名为MyObject的图形对象,然后通过改变Left和Top属性来调整其位置。4.2.2控制图形对象可见性'声明变量

DimObjAsObject

'获取图形对象

SetObj=GetObject("MyObject")

'控制可见性

IfGetTagValue("VisibilityTag")=1Then

Obj.Visible=True

Else

Obj.Visible=False

EndIf这里,我们根据VisibilityTag标签的值来控制MyObject的可见性。如果标签值为1,对象可见;否则,对象不可见。4.3脚本与报警系统集成Movicon的报警系统可以被脚本触发或控制,以响应特定的事件或条件。下面是一个示例,展示如何使用脚本触发报警。4.3.1触发报警'声明变量

DimAlarmAsObject

'获取报警对象

SetAlarm=GetObject("MyAlarm")

'触发报警

Alarm.TriggerAlarm"报警信息","报警类型"在这个例子中,我们首先使用GetObject函数获取名为MyAlarm的报警对象,然后使用TriggerAlarm方法来触发报警,其中"报警信息"是报警的具体描述,"报警类型"是报警的类型。4.3.2控制报警状态'声明变量

DimAlarmAsObject

'获取报警对象

SetAlarm=GetObject("MyAlarm")

'控制报警状态

IfGetTagValue("AlarmStatusTag")=1Then

Alarm.SetAlarmStateTrue

Else

Alarm.SetAlarmStateFalse

EndIf这里,我们根据AlarmStatusTag标签的值来控制MyAlarm的报警状态。如果标签值为1,报警状态为真;否则,报警状态为假。通过这些示例,我们可以看到,Movicon脚本编程允许我们与标签、图形对象和报警系统进行深度交互,从而实现复杂的应用逻辑和动态的界面控制。在实际应用中,这些脚本可以被嵌入到各种事件处理程序中,如按钮点击、定时器事件等,以响应实时的系统状态变化。5高级脚本编程技术5.1使用脚本进行数据处理在ProgeaMovicon中,脚本编程是处理数据的强大工具。通过脚本,可以实现数据的转换、分析和存储,以满足自动化系统中的复杂需求。下面,我们将通过一个具体的例子来展示如何使用脚本进行数据处理。5.1.1示例:数据转换假设我们有一个温度传感器,其输出数据是以华氏度表示的,但我们系统中需要使用摄氏度。我们可以编写一个简单的脚本来实现这一转换。#脚本:华氏度转摄氏度

deffahrenheit_to_celsius(fahrenheit):

"""

将华氏温度转换为摄氏温度。

参数:

fahrenheit(float):华氏温度值。

返回:

float:摄氏温度值。

"""

celsius=(fahrenheit-32)*5.0/9.0

returncelsius

#假设传感器读数为77华氏度

fahrenheit_reading=77.0

#调用函数进行转换

celsius_reading=fahrenheit_to_celsius(fahrenheit_reading)

#输出结果

print(f"华氏度{fahrenheit_reading}转换为摄氏度为{celsius_reading}")在这个例子中,我们定义了一个函数fahrenheit_to_celsius,它接受一个华氏温度值作为参数,并返回相应的摄氏温度值。通过调用这个函数,我们可以轻松地将传感器读数从华氏度转换为摄氏度。5.2脚本中的错误处理和调试在脚本编程中,错误处理和调试是确保脚本稳定运行的关键。Movicon提供了多种工具和方法来帮助开发者处理脚本中的错误,并进行有效的调试。5.2.1示例:错误处理考虑一个场景,我们需要从数据库中读取数据,但数据库连接可能偶尔会失败。我们可以使用try...except语句来处理这种潜在的错误。#脚本:从数据库读取数据并处理错误

defread_data_from_database():

"""

从数据库读取数据,并处理可能的连接错误。

"""

try:

#假设这是连接数据库并读取数据的代码

connection=database_connect()

data=connection.read()

returndata

exceptExceptionase:

#如果发生错误,记录错误信息并返回None

log_error(e)

returnNone

#调用函数

data=read_data_from_database()

ifdataisnotNone:

#数据读取成功,进行后续处理

process_data(data)

else:

#数据读取失败,执行错误处理逻辑

handle_error()在这个例子中,我们使用try...except语句来捕获并处理数据库读取过程中可能发生的任何异常。如果发生错误,我们调用log_error函数记录错误信息,并返回None,以便在主程序中进行错误处理。5.2.2示例:调试调试脚本时,使用print语句或集成的调试工具来检查变量的值和脚本的执行流程是非常有用的。#脚本:调试数据处理流程

defprocess_data(data):

"""

处理从数据库读取的数据。

参数:

data(list):数据列表。

"""

print("开始处理数据...")

foritemindata:

print(f"处理数据项:{item}")

#假设这是数据处理的代码

processed_item=process_item(item)

print(f"处理后的数据项:{processed_item}")

print("数据处理完成。")

#调用函数

data=[1,2,3,4,5]

process_data(data)在这个例子中,我们使用print语句来输出数据处理过程中的关键信息,这有助于我们理解脚本的执行流程和变量的值,从而进行有效的调试。5.3脚本优化和性能提升优化脚本以提高性能是高级脚本编程的重要方面。通过减少不必要的计算和优化数据结构,可以显著提高脚本的执行效率。5.3.1示例:优化循环假设我们有一个脚本,需要对大量数据进行处理。使用列表推导式可以比传统的循环更高效地处理数据。#脚本:优化数据处理循环

defprocess_large_data(data):

"""

使用列表推导式优化数据处理。

参数:

data(list):大数据列表。

返回:

list:处理后的数据列表。

"""

#传统循环处理数据

processed_data=[]

foritemindata:

processed_data.append(item*2)

returnprocessed_data

#使用列表推导式优化

defoptimized_process_large_data(data):

"""

使用列表推导式优化数据处理。

参数:

data(list):大数据列表。

返回:

list:处理后的数据列表。

"""

return[item*2foritemindata]

#测试数据

large_data=list(range(1000000))

#测量两种方法的执行时间

importtime

start_time=time.time()

process_large_data(large_data)

end_time=time.time()

print(f"传统循环处理时间:{end_time-start_time}秒")

start_time=time.time()

optimized_process_large_data(large_data)

end_time=time.time()

print(f"优化后处理时间:{end_time-start_time}秒")在这个例子中,我们比较了传统循环和列表推导式处理大数据的效率。列表推导式通常比循环更快,因为它避免了每次迭代时的额外开销,如创建新列表和追加元素。通过这些高级脚本编程技术的示例,我们可以看到在ProgeaMovicon中,脚本不仅可以用于基本的数据处理,还可以通过错误处理和优化来提高脚本的稳定性和性能。掌握这些技术将使您能够更有效地利用Movicon的脚本编程功能,以满足自动化系统中的复杂需求。6脚本编程实例与实践6.1实现数据采集和处理脚本在自动化项目中,数据采集和处理是核心任务之一。Movicon提供了强大的脚本环境,允许用户编写自定义脚本来满足特定的数据处理需求。以下是一个使用Movicon脚本进行数据采集和处理的示例。6.1.1示例:温度数据的平均值计算假设我们从一个温度传感器获取数据,需要计算过去一小时内所有温度读数的平均值。我们将使用Movicon的脚本来实现这一功能。'定义一个函数来计算平均温度

FunctionCalculateAverageTemperature()

DimsumAsDouble

DimcountAsInteger

DimiAsInteger

DimtemperatureArray()AsDouble

'从数据库中读取过去一小时的温度数据

temperatureArray=ReadFromDatabase("TemperatureSensor","LastHour")

'初始化计数器和总和

sum=0

count=UBound(temperatureArray)-LBound(temperatureArray)+1

'遍历数组,计算总和

Fori=LBound(temperatureArray)ToUBound(temperatureArray)

sum=sum+temperatureArray(i)

Next

'计算平均值

DimaverageAsDouble

average=sum/count

'返回平均温度

CalculateAverageTemperature=average

EndFunction解释函数定义:CalculateAverageTemperature函数用于计算平均温度。数组读取:temperatureArray从数据库中读取过去一小时的温度数据。初始化变量:sum用于存储温度总和,count用于存储数据点的数量。遍历计算:使用For循环遍历数组,累加温度值。平均值计算:average变量存储总和除以数据点数量的结果。返回结果:函数返回计算出的平均温度。6.2创建自定义Movicon控件脚本Movicon允许用户创建自定义控件,以增强界面的交互性和功能性。下面是一个创建自定义控件脚本的示例,该控件用于显示设备状态。6.2.1示例:设备状态指示器控件我们将创建一个名为DeviceStatusIndicator的自定义控件,它根据设备状态显示不同的颜色。'定义自定义控件

PublicClassDeviceStatusIndicator

'定义属性

PublicPropertyStatusAsInteger

'控件绘制函数

PublicSubDrawControl()

DimcolorAsInteger

'根据设备状态设置颜色

IfStatus=0Then

color=RGB(0,255,0)'绿色,表示正常

ElseIfStatus=1Then

color=RGB(255,255,0)'黄色,表示警告

Else

color=RGB(255,0,0)'红色,表示故障

EndIf

'绘制控件

DrawRectangle(0,0,100,100,color)

EndSub

EndClass解释类定义:DeviceStatusIndicator类定义了控件的基本结构。属性定义:Status属性用于接收设备状态。绘制函数:DrawControl函数根据设备状态设置控件颜色。颜色设置:使用If语句根据状态设置不同的颜色。绘制控件:DrawRectangle函数用于绘制控件,参数包括位置、大小和颜色。6.3脚本在自动化项目中的综合应用在自动化项目中,脚本可以用于多种任务,包括但不限于数据处理、控件创建和系统集成。下面是一个示例,展示如何在自动化项目中综合使用脚本来实现设备监控和报警系统。6.3.1示例:设备监控和报警系统我们将使用Movicon脚本来监控设备温度,当温度超过预设阈值时,触发报警。'定义报警阈值

ConstALARM_THRESHOLDAsDouble=80.0

'定义监控函数

SubMonitorDeviceTemperature()

DimcurrentTemperatureAsDouble

DimalarmStatusAsBoolean

'读取当前温度

currentTemperature=ReadFromDevice("TemperatureSensor")

'检查温度是否超过阈值

IfcurrentTemperature>ALARM_THRESHOLDThen

alarmStatus=True

Else

alarmStatus=False

EndIf

'更新报警状态控件

UpdateAlarmStatus(alarmStatus)

EndSub

'定义更新报警状态的函数

SubUpdateAlarmStatus(alarmStatusAsBoolean)

DimalarmIndicatorAsDeviceStatusIndicator

SetalarmIndicator=GetControl("AlarmIndicator")

'设置控件状态

IfalarmStatusThen

alarmIndicator.Status=2'设备故障状态

Else

alarmIndicator.Status=0'正常状态

EndIf

'重新绘制控件

alarmIndicator.DrawControl()

EndSub解释报警阈值:ALARM_THRESHOLD常量定义了触发报警的温度阈值。监控函数:MonitorDeviceTemperature函数读取设备温度,并检查是否超过阈值。报警状态更新:UpdateAlarmStatus函数接收报警状态,并更新报警状态指示器控件。控件状态设置:根据报警状态设置DeviceStatusIndicator控件的状态。控件重绘:调用DrawControl函数重新绘制控件,以反映最新的状态。通过这些实例,我们可以看到Movicon脚本在自动化项目中的强大功能和灵活性。无论是数据处理、控件创建还是系统集成,脚本都是实现自动化项目关键功能的重要工具。7脚本编程常见问题与解决方案7.1调试脚本时的常见错误7.1.1错误1:变量未定义在Movicon脚本编程中,一个常见的错误是尝试使用未定义的变量。例如,如果脚本中使用了一个在任何地方都没有声明的变量myVar,脚本运行时将抛出错误。示例代码//错误示例:尝试使用未定义的变量

voidMain(){

Console.WriteLine(myVar);

}解决方案确保在使用变量之前先声明它。在Movicon中,通常使用Dim关键字来声明变量。正确代码//正确示例:先声明变量再使用

voidMain(){

DimmyVarAsInteger=10;

Console.WriteLine(myVar);

}7.1.2错误2:类型不匹配当脚本尝试将不同类型的值赋给变量时,会出现类型不匹配的错误。例如,将字符串赋给一个整型变量。示例代码//错误示例:类型不匹配

voidMain(){

DimmyVarAsInteger;

myVar="HelloWorld";

}解决方案确保赋值时变量类型与值的类型相匹配,或者使用类型转换。正确代码//正确示例:类型匹配或转换

voidMain(){

DimmyVarAsInteger;

myVar=123;//类型匹配

myVar=CInt("123");//类型转换

}7.2性能瓶颈分析与解决7.2.1瓶颈1:过度使用全局变量在脚本中过度使用全局变量可以导致性能问题,因为每次脚本执行时,都需要检查全局变量的值,这可能增加不必要的计算负担。示例代码//错误示例:过度使用全局变量

PublicSharedmyGlobalVarAsInteger=0;

SubUpdateValue()

myGlobalVar=myGlobalVar+1;

EndSub

SubMain()

Fori=1To1000000

UpdateValue();

Next

EndSub解决方案尽量使用局部变量,减少全局变量的使用,特别是在循环中。正确代码//正确示例:使用局部变量

SubUpdateValue()

DimlocalVarAsInteger=0;

localVar=localVar+1;

EndSub

SubMain()

DimmyVarAsInteger=0;

Fori=1To1000000

UpdateValue();

myVar=myVar+1;

Next

EndSub7.2.2瓶颈2:频繁的I/O操作频繁的输入/输出操作,如读写文件或数据库,可以显著降低脚本的执行速度。示例代码//错误示例:频繁的文件读写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论