Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9701

Siemens#Openness

$
0
0

Siemens Openness とは?

TIA Portal OpennessはSiemens社から提供したエンジニアリンクオーブンインタフェースです。このインタフェースを使うによってTIA Portal(Siemens社のエンジニアリンクツール)を外部アプリケーションから制御することも可能になります。

TIA Portal Opennessを使えば、こんなことができるようになります.

  • プロジェクト作成
  • プロジェクト修正
  • プロジェクト削除
  • プロジェクトデータを読む
  • プロジェクトデータをほかのアプリケーションを操作する

イメージがあまり浮いていませんが、下図のように表示するといかがでしょう?XMLFilesがありまして、中に作成したいDevicesなどを記入されています。そしてTIA Openness Projectがありまして、パソコンに入ってるTIA PortalのDevices追加、Connection作成などの動作はそのTIA Openness Project経由しXMLをImportし操作を行う。

image.png

紹介

ビデオ

Manual

作業環境

  • Python 3.7.1
  • pythonnet
  • Jupyter

インストールするときの不明点

プログラミングステップ

  1. TIA PortalをOpennessに連携できる環境を作る
  2. TIA Portalをアクセスのプログラム作る
  3. TIA PortalをアクセスのプログラムActivateし、TIA Portalをアクセスする
  4. TIA Portal起動する
  5. Projectを開く
  6. さまざまなコマンドを実行する
  7. Projectを保存・閉じる
  8. TIA Portalの間のアクセスを切断する

TIA Portal Openness Object Model

以下の図はObject Modelについて説明します。TIA PortalにF1を押しOpennessを検索すれば同じなものもでてきます。

Highest Level

image.png

GlobalLibrary

image.png

ProjectLibrary

image.png

HmiTarget

image.png

PlcSoftware

image.png

各Objectの関係:
image.png

本来ならC# でプログラミングしないといけないですが、ここでpythonnetを使ってOpennessのdllを読み込んでPythonでやりたいと思います。

実装

プロジェクト作成

以下はProject_testというProjectをC:\tiav15_1_projectに作ることができます。
(もし同じ名前のプロジェクトも既にあるだと例外が発生します。)

ProjectCreate.py
importclrclr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')fromSystem.IOimportDirectoryInfo,FileInfoimportSiemens.EngineeringastiaimportSiemens.Engineering.HW.Featuresashwfproject_path=DirectoryInfo('C:\\tiav15_1_project')project_name='Project_test'print('Starting TIA with UI')mytia=tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)myproject=mytia.Projects.Create(project_path,project_name)

プロジェクト開く

以下はプロジェクトを開くのコードです。
(もし該当プロジェクト既に開いてるのあれば例外が発生します。)

ProjectOpen.py
importclrclr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')fromSystem.IOimportDirectoryInfo,FileInfoimportSiemens.EngineeringastiaimportSiemens.Engineering.HW.FeaturesashwfdefopenTIAProject(tia,open_path):try:project=tia.Projects.Open(open_path)returnprojectexceptExceptionase:print(e)returnNoneopen_path=FileInfo('C:\\tiav15_1_project\\project\\porject\\AppTest\\AppTest.ap15_1')print('Starting TIA with UI')mytia=tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)myproject=openTIAProject(mytia,open_path)

プロジェクトを閉じる

myproject.Close()

プロジェクトを保存

myproject.Save()

プロジェクトの情報もらう

print('Project Information\n''-Name:{}\n''-Author:{}\n''-Comment:{}\n''-Copy Right:{}\n''-Creation time:{}\n''-Family:{}\n'\
        '-IsModified:{}\n''-Language Settings:{}\n''-Last Modified:{}\n''-Last Modified By:{}\n''-Name:{}\n''-Path:{}\n''-Size:{}\n''-Version:{}\n'.format(myproject.Name,myproject.Author,myproject.Comment,myproject.Copyright,myproject.CreationTime,myproject.Family,myproject.IsModified,myproject.LanguageSettings,myproject.LastModified,myproject.LastModifiedBy,myproject.Name,myproject.Path,myproject.Size,myproject.Version))

Device操作

基本的にはデバイスのOrder Numberを参照してやります。(たまに新し過ぎるものが追加でません…)
デバイスのOrder Number常に見えるようにする設定:
image.png

そのCheckBox入れると、Hardware Catalogの表示はこんな風に変わります:
image.png

Device追加

CreateDevice.py
importclrclr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')fromSystem.IOimportDirectoryInfo,FileInfoimportSiemens.EngineeringastiaimportSiemens.Engineering.HW.Featuresashwfproject_path=DirectoryInfo('C:\\tiav15_1_project')project_name='Project_Demo16'#Creating new project
print('Creating project..')#Starting TIA
print('Starting TIA with UI')mytia=tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)try:myproject=mytia.Projects.Create(project_path,project_name)exceptExceptionase:print(e)#Addding Stations
print('Creating station 1')station1_mlfb='OrderNumber:6ES7 515-2AM01-0AB0/V2.0'station1=myproject.Devices.CreateWithItem(station1_mlfb,'station1','station1')print('Station1 is Created.')

TIAのViewを変わる

Topology view

myproject.ShowHwEditor(tia.HW.View.Topology)

image.png

NetworkView

myproject.ShowHwEditor(tia.HW.View.Network)

image.png

Device view

myproject.ShowHwEditor(tia.HW.View.Device)

image.png

Languages

英語追加

fromSystem.GlobalizationimportCultureInfoEnlishLanguage=myproject.LanguageSettings.Languages.Find(CultureInfo('en-US'))Comments=myproject.CommentCommentsItem=Comments.ItemsEnglishComment=CommentsItem.Find(EnlishLanguage)

SoftwareContainer

PLCを追加したあと、中のBlocks、Tagテーブル操作するにはこのSoftwareContainerが必要です。
ここで仮にPLCが追加済です。

SoftwareContainerもらう

SoftwareContainer=tia.IEngineeringServiceProvider((myproject.Devices[0].DeviceItems[1])).GetService[hwf.SoftwareContainer]()software=SoftwareContainer.get_Software()

Tagテーブル追加

TagTableName='MyTable'print('Creating PLC Tag Table:'+TagTableName)TagTableGroup=software.get_TagTableGroup()TagTable=TagTableGroup.get_TagTables()TagTable.Create(TagTableName)plcTable=TagTable.Find(TagTableName)

PLC Tag追加

tagComposition=plcTable.TagsStart=10End=11print('Start to create IOTags..')forkinrange(Start,End+1):foriinrange(0,8):dataType='Bool'tagName='MyTag_'+str(k)+'.'+str(i)Address='%Q'+str(k)+'.'+str(i)Comment='My Tag:)! {}'.format(str(k)+'.'+str(i))print('Creating tag..Name:{},Type:{},Address:{},Comment:{}'.format(tagName,dataType,Address,Comment))tag1=tagComposition.Create(tagName,dataType,Address)CommentTag1=tag1.Comment.ItemsCcTag1=CommentTag1.Find(EnlishLanguage)CcTag1.Text=Comment

image.png

プロジェクトコンパイル

importSiemens.Engineering.CompilerascpsoftwareComp=software.GetService[cp.ICompilable]()softwareComp.Compile()

BlockとBlockグループ

Blockグループもらう

BlockGroup=software.BlockGroup

BlockグループにあるBlock情報もらう

defdefine_ProgrammingLanguage(ProgrammingLanguage):ifProgrammingLanguage==2:return'LAD'elifProgrammingLanguage==3:return'FBD'elifProgrammingLanguage==1:return'STL'elifProgrammingLanguage==4:return'SCL'elifProgrammingLanguage==5:return'DB'elifProgrammingLanguage==6:return'GRAPH'Groups=BlockGroup.get_Groups()forbginGroups:forbinbg.get_Blocks():AttributeInfos=b.GetAttributeInfos()forAttributeinAttributeInfos:print(Attribute.Name+':'+str(b.GetAttribute(Attribute.Name)))print('-'*30)

image.png

Blockグループ作成

defCreateBlockGroup(plcsoftware,GroupName):systemGroup=plcsoftware.BlockGroupgroupComposition=systemGroup.Groupsifsoftware.BlockGroup.Groups.Find(GroupName):print(GroupName+' is existed. Can not Created..')else:createdGroup=groupComposition.Create(GroupName)CreateBlockGroup(software,'Folder2221')

Blockグループ探す

Block_autoNumber=Groups.Find('TestGroup').Blocks.Find('Block_1').GetAttribute('AutoNumber')

Blockグループ削除

defDeleteBlockFolder(plcsoftware,GroupName):group=plcsoftware.BlockGroup.Groups.Find(GroupName)ifgroup:group.Delete()else:print(GroupName+' is not existed in your project.')DeleteBlockFolder(software,'Folder2221')

Blocksグループを回す

defEnumerateBlockUserGroups(blockUserGroup):forsubBlockUserGroupinblockUserGroup.Groups:print('|-'+subBlockUserGroup.Name)defEnumerateAllBlockGroupsAndSubgroups(plcsoftware):forblockUserGroupinplcsoftware.BlockGroup.Groups:print(blockUserGroup.Name)EnumerateBlockUserGroups(blockUserGroup)EnumerateAllBlockGroupsAndSubgroups(software)

image.png

BlockをExport

fromSiemens.EngineeringimportExportOptions,ImportOptionsBlock_ex=Groups.Find('TestGroup').Blocks.Find('Block_1')save_path=FileInfo('C:\\Data\\f.xml')Block_ex.Export(save_path,ExportOptions.WithDefaults)

BlockをImport

gex=Groups.Find('TestGroup')bex=gex.Blocks.Import(save_path,ImportOptions.Override)

Blockをアクセス

defAccessASingleBlock(plcsoftware,blockname):returnplcsoftware.BlockGroup.Blocks.Find(blockname)block=AccessASingleBlock(software,'Main')

Blockの設定変更

block=AccessASingleBlock(software,'Block_1')block.SetAttribute('AutoNumber',False)block.SetAttribute('Number',999)

Blockをまわす

defEnumerateAllBlocks(plcsoftware):forblockinsoftware.BlockGroup.Blocks:print(block.Name)EnumerateAllBlocks(software)

image.png

PLC操作

Online

fromSiemens.Engineering.OnlineimportOnlineProviderplc=myproject.Devices[0]plc1=plc.DeviceItems[1]plc_online=plc1.GetService[OnlineProvider]()

image.png

Connection interface Configure

forconfigmodeinonlineConfig.Modes:print('Interface:'+configmode.Name)forpcIntefaceinconfigmode.PcInterfaces:print('PC Interface Name:'+str(pcInteface.Name))print('PC Interface Number:'+str(pcInteface.Number))fortagetInterfaceinpcInteface.TargetInterfaces:print('Taget Interface:'+str(tagetInterface.Name))

image.png

Get the Connection By Name

mode=onlineConfig.Modes.Find('PN/IE')pcInt=mode.PcInterfaces.Find('PLCSIM',1)slot=pcInt.TargetInterfaces.Find('1 X1')

access subnets and gateways by their name or IP address

defAccessSubnetAndGatewayOfPCInterface(pcInterface):subnet=pcInteface.Subnets.Find('PN/IE_1')print(subnet.Name)subnetAddress=subnet.Addresses.Find('192.168.0.1')print(subnetAddress.Name)gateway=subnet.Gateways.Find('Gateway 1')print(gateway)ifgateway:gatewayAddress=gateway.Address.Find('192.168.0.2')print(gatewayAddress)AccessSubnetAndGatewayOfPCInterface(pcInt)

image.png

Go Offline/Online

defSetOnlineConnectionForAllPLCs(project,oper):fordeviceinproject.Devices:fordeviceItemindevice.DeviceItems:onlineProvider=deviceItem.GetService[OnlineProvider]()ifonlineProvider:ifoper==1:onlineProvider.GoOnline()else:onlineProvider.GoOffline()SetOnlineConnectionForAllPLCs(myproject,0)

Network Connection作成

まず現在の構成:
image.png

#get the Devices
plc1=myproject.Devices[0]v90=myproject.Devices[1]print(v90.Name)print(plc1.Name)

Subnet作る

myproject.Subnets.Create('System:Subnet.Ethernet','NewSubNet2')

Subnetがあるかを確認

もしなかったらNoneが戻ってきます。

subnet=myproject.Subnets.Find('NewSubNet2')

SubnetのIPなど変更

#Change IP and Connect to Subnet
n_interfaces=[]device_item_aggregation=plc1.DeviceItems[1].DeviceItemsdevice_item=device_item_aggregation[3]fordindevice_item_aggregation:print(d.Name)network_service=tia.IEngineeringServiceProvider(device_item).GetService[hwf.NetworkInterface]()network_service.Nodes[0].SetAttribute('Address','192.168.0.126')network_service.Nodes[0].ConnectToSubnet(subnet)n_interfaces.append(network_service)

IOSytem作る

#Create IO System
ioSystem=n_interfaces[0].IoControllers[0].CreateIoSystem("PNIO");

接続

#Connect Other Devices
device_item_aggregation1=v90.DeviceItems[1].DeviceItemsdevice_item=device_item_aggregation1[0]print(device_item.Name)network_service=tia.IEngineeringServiceProvider(device_item).GetService[hwf.NetworkInterface]()network_service.Nodes[0].SetAttribute('Address','192.168.0.145')network_service.Nodes[0].ConnectToSubnet(subnet)n_interfaces.append(network_service)len(n_interfaces)n_interfaces[1].IoConnectors[0].ConnectToIoSystem(ioSystem)

Technology Objects

fromSiemens.Engineering.SW.TechnologicalObjectsimportTechnologicalInstanceDBfromSystemimportVersionasvr

PID_Compact

to11=software.TechnologicalObjectGroup.TechnologicalObjectstoName="PID_Compact_1"toType='PID_Compact'version=vr("2.3")pid_compact=to11.Create(toName,toType,version)
#Config Constant
PID_COMPACT_MODE_INACTIVE=0PID_COMPACT_MODE_PRETUNING=1PID_COMPACT_MODE_FINETUNING=2PID_COMPACT_MODE_AUTO=3PID_COMPACT_MODE_MANUAL=4#PhysicalQuantity
PID_COMPACT_PHYSICAL_GENERAL=0PID_COMPACT_PHYSICAL_TEMPERATURE=1PID_COMPACT_PHYSICAL_PRESSURE=2PID_COMPACT_PHYSICAL_LENGTH=3PID_COMPACT_PHYSICAL_FLOW=4PID_COMPACT_PHYSICAL_BRIGHTNESS=5PID_COMPACT_PHYSICAL_LLLUMINANCE=6PID_COMPACT_PHYSICAL_FORCE=7PID_COMPACT_PHYSICAL_TORQUE=8PID_COMPACT_PHYSICAL_MASS=9PID_COMPACT_PHYSICAL_CURRENT=10PID_COMPACT_PHYSICAL_VOLTAGE=11PID_COMPACT_PHYSICAL_POWER=12PID_COMPACT_PHYSICAL_AREA=13PID_COMPACT_PHYSICAL_VOLUME=14PID_COMPACT_PHYSICAL_ANGLE=15PID_COMPACT_PHYSICAL_VISCOSITY=16PID_COMPACT_PHYSICAL_SPEED=17PID_COMPACT_PHYSICAL_VELOCITY=18PID_COMPACT_PHYSICAL_DENSITY=19PID_COMPACT_PHYSICAL_FREQUENCY=20PID_COMPACT_PHYSICAL_ANGULAR_VELOCITY=21#PhysicalUnit
PID_COMPACT_PHYSICAL_GENERAL_UNIT_PERCENTAGE=0PID_COMPACT_PHYSICAL_TEMPERATURE_UNIT_C=0PID_COMPACT_PHYSICAL_TEMPERATURE_F=1PID_COMPACT_PHYSICAL_TEMPERATURE_K=2

パラメータ設定

defSetTOParas(to,config,Value):paras=to.Parameters.Find(config)print(paras.Name+' is '+str(paras.Value)+'.')paras.Value=Valueprint(paras.Name+'is changed to '+str(paras.Value)+'.')#Mode
config='Mode'# paras=pid_compact.Parameters.Find(config)
SetTOParas(pid_compact,config,PID_COMPACT_MODE_MANUAL)#PhysicalQuantity
config='PhysicalQuantity'SetTOParas(pid_compact,config,PID_COMPACT_PHYSICAL_TEMPERATURE)config='PhysicalUnit'SetTOParas(pid_compact,config,PID_COMPACT_PHYSICAL_TEMPERATURE_F)#PID values set by user
config='_Retain.CtrlParams.SetByUser'SetTOParas(pid_compact,config,True)config='Retain.CtrlParams.Gain'SetTOParas(pid_compact,config,1.1)config='Retain.CtrlParams.Ti'SetTOParas(pid_compact,config,20.1)config='Retain.CtrlParams.Td'SetTOParas(pid_compact,config,0.1)

High_Speed_Counter

to_high_speed_counter=[]foriinrange(2):toName='High_Speed_Counter_'+str(i)toType='High_Speed_Counter'version=vr("3.0")temp=to11.Create(toName,toType,version)to_high_speed_counter.append(temp)

TO_PositioningAxis

いまの構成はこうです:
image.png

Object作成

to11=software.TechnologicalObjectGroup.TechnologicalObjectsTO_PositioningAxis=[]foriinrange(2):toName='TO_PositioningAxis'+str(i)toType='TO_PositioningAxis'version=vr("3.0")temp=to11.Create(toName,toType,version)TO_PositioningAxis.append(temp)TO_PositioningAxis[0].Name

Objectのパラメータ設定

TO_PositioningAxis[0].Parameters.Find('Actor.DataAdaption').Value=1TO_PositioningAxis[0].Parameters.Find('_Actor.Interface.Telegram').Value=105TO_PositioningAxis[0].Parameters.Find('_Sensor[1].Interface.Telegram').Value=105

PLCとConnectする

#Get the Positioning Axis Object
x=TO_PositioningAxis[0]#Get the AxisHardwareConnectionProvider from Motion packages
AxisHardwareConnectionProvider=x.GetService[Motion.AxisHardwareConnectionProvider]()fordeviceinmyproject.Devices:fordeviceitemindevice.DeviceItems:print(deviceitem.Name)v90=myproject.Devices[1].DeviceItemsv90_1=v90[1].DeviceItems[1]v90_1_Deviceitem=v90[1].DeviceItemsv90_1_Deviceitem[2].DeviceItems[2].NameAxisHardwareConnectionProvider.ActorInterface.Connect(v90_1_Deviceitem[2].DeviceItems[2])

image.png

Full Code

importclrclr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')fromSystem.IOimportDirectoryInfo,FileInfoimportSiemens.EngineeringastiaimportSiemens.Engineering.HW.FeaturesashwfimportSiemens.Engineering.SW.TechnologicalObjects.MotionasMotionfromSiemens.Engineering.SW.TechnologicalObjectsimportTechnologicalInstanceDBfromSystemimportVersionasvrdefopenTIAProject(tia,open_path):try:project=tia.Projects.Open(open_path)returnprojectexceptExceptionase:print(e)returnNoneopen_path=FileInfo('C:\\tiav15_1_project\\project\\porject\\AppTest\\AppTest.ap15_1')#Starting TIA
print('Starting TIA with UI')mytia=tia.TiaPortal(tia.TiaPortalMode.WithUserInterface)myproject=openTIAProject(mytia,open_path)kkkk=tia.IEngineeringServiceProvider((myproject.Devices[0].DeviceItems[1])).GetService[hwf.SoftwareContainer]()software=kkkk.get_Software()to11=software.TechnologicalObjectGroup.TechnologicalObjectsTO_PositioningAxis=[]foriinrange(2):toName='TO_PositioningAxis'+str(i)toType='TO_PositioningAxis'version=vr("3.0")temp=to11.Create(toName,toType,version)TO_PositioningAxis.append(temp)TO_PositioningAxis[0].Namekkkk=tia.IEngineeringServiceProvider((myproject.Devices[0].DeviceItems[1])).GetService[hwf.SoftwareContainer]()software=kkkk.get_Software()#Get the Positioning Axis Object
x=TO_PositioningAxis[0]#Get the AxisHardwareConnectionProvider from Motion packages
AxisHardwareConnectionProvider=x.GetService[Motion.AxisHardwareConnectionProvider]()fordeviceinmyproject.Devices:fordeviceitemindevice.DeviceItems:print(deviceitem.Name)v90=myproject.Devices[1].DeviceItemsv90_1=v90[1].DeviceItems[1]v90_1_Deviceitem=v90[1].DeviceItemsv90_1_Deviceitem[2].DeviceItems[2].NameAxisHardwareConnectionProvider.ActorInterface.Connect(v90_1_Deviceitem[2].DeviceItems[2])

Processes

いま開いてるTIAをもらう。そのためにProcessesを使います。

importclrclr.AddReference('C:\\Program Files\\Siemens\\Automation\\Portal V15_1\PublicAPI\\V15.1\\Siemens.Engineering.dll')fromSystem.IOimportDirectoryInfo,FileInfoimportSiemens.EngineeringastiaimportSiemens.Engineering.HW.FeaturesashwfimportSiemens.Engineering.SW.TechnologicalObjects.MotionasMotionfromSiemens.Engineering.SW.TechnologicalObjectsimportTechnologicalInstanceDBfromSystemimportVersionasvrprint('Hello,let me to get your process..')processes=tia.TiaPortal.GetProcesses()i=1forprocessinprocesses:print('---'*10)#get the Process information
print('Process{} Information\n''-Path:{}\n''-Acquisition Time:{}\n''-ID:{}\n''-UI:{}\n'.format(i,process.ProjectPath,process.AcquisitionTime,process.Id,('Yes'ifprocess.Mode>=1else'No')))attach=process.Attach()forprojectinattach.get_Projects():print('Project Information\n''-Name:{}\n''-Author:{}\n''-Comment:{}\n''-Copy Right:{}\n''-Creation time:{}\n''-Family:{}\n'\
                '-IsModified:{}\n''-Language Settings:{}\n''-Last Modified:{}\n''-Last Modified By:{}\n''-Name:{}\n''-Path:{}\n''-Size:{}\n''-Version:{}\n'.format(project.Name,project.Author,project.Comment,project.Copyright,project.CreationTime,project.Family,project.IsModified,project.LanguageSettings,project.LastModified,project.LastModifiedBy,project.Name,project.Path,project.Size,project.Version))print('Used Product:')forUsedProductinproject.get_UsedProducts():print('-'+UsedProduct.Name)i+=1print('\n')a=input('Press key to exit\n')ifa:exit(0)

Hmi

hmitarget

importSiemens.Engineering.HmiasHmiimportSiemens.Engineering.Hmi.TagasHmiTagimportSiemens.Engineering.Hmi.ScreenasHmiScreenimportSiemens.Engineering.Hmi.CycleasHmiCycleimportSiemens.Engineering.Hmi.CommunicationasHmiCommunicationimportSiemens.Engineering.Hmi.GlobalizationasHmiGlobalizationimportSiemens.Engineering.Hmi.TextGraphicListasHmiTextGraphicListimportSiemens.Engineering.Hmi.RuntimeScriptingasHmiRuntimeScriptingfromSiemens.EngineeringimportExportOptionsasExportOptionsfromSiemens.EngineeringimportImportOptionsasImportOptionsFUNCTION_END_WITHOUT_ERROR=7000FUNCTION_END_WITH_ERROR=8900IMPORT_HMI_PATH_CYCLES='C:\\tia_ExternalApps\\Export\\hmi\\templates\\templates.xml'IMPORT_HMI_PATH_CYCLES_TEMP='C:\\tia_ExternalApps\\Export\\hmi\\templates\\_templates.xml'Hmi1=project.Devices[2]forDeviceinHmi1.DeviceItems:print(Device.Name)hmitarget=tia.IEngineeringServiceProvider(Hmi1.DeviceItems[3]).GetService[hwf.SoftwareContainer]().Software

Create Screen Folder

defCreateScreenFolder(hmitaget,FolderName=''):'''Function to Create the ScreenFodler Inside your HMI_RT

    Parameters
    ----------
    hmitarget:HmiTarget Objects
        The Object that you get from hwf.SoftwareContainer.
    FolderName:String
        The Folder Name that you would like to create.

    Returns
    ----------
    8900:
        If Exception is happened while Function executing.
    ScreenUserFolder:
        The Screen Folder Object that you created.

    '''try:hmitarget.ScreenFolder.Folders.Create(folderName)exceptExceptionase:print(e)returnFUNCTION_END_WITH_ERRORreturnhmitarget.ScreenFolder.Folders.Find(folderName)

Delete Screen From Folder

defDeleteScreenFromFolder(hmitarget,FolderName,ScreenName):'''Function to Delete the Screen Locate on the folder Inside your HMI_RT

    Parameters
    ----------
    hmitarget:HmiTarget Objects
        The Object that you get from hwf.SoftwareContainer.
    FolderName:String
        The Name of Folder that contatins the Screen which you want to delete.
    ScreenName:String
        The Name of Screen that you want to delete.

    Returns
    ----------
    8000:
        Screen can not found inside the folder.
    8900:
        Screen is found, but Exception is happened while screen.Delete() executing.
    7000:
        Function is end without Error.

    '''try:screenuserFolder=hmitarget.ScreenFolder.Folders.Find(FolderName)screens=screenuserFolder.Screensscreen=screens.Find(ScreebnName)ifscreenisNone:return8000else:screen.Delete()exceptExceptionase:print(e)returnFUNCTION_END_WITH_ERRORreturnFUNCTION_END_WITHOUT_ERROR

Delete ScreenTemplate from folder

defDeleteScreenTemplateFromFolder(hmitarget,FolderName,ScreenName):'''Function to Delete the Templatescreen Locate on the Templatefolder Inside your HMI_RT

    Parameters
    ----------
    hmitarget:HmiTarget Objects
        The Object that you get from hwf.SoftwareContainer.
    FolderName:String
        The Name of Templatefolder that contatins the Screen which you want to delete.
    ScreenName:String
        The Name of Templatescreen that you want to delete.

    Returns
    ----------
    8000:
        Screen can not found inside the folder.
    8900:
        Screen is found, but Exception is happened while screen.Delete() executing.
    7000:
        Function is end without Error.

    '''try:folder=hmitarget.ScreenTemplateFolder.Folders.Find(FolderName)iffolderisNone:return8000else:templates=folder.ScreenTemplatestemplate=templates.Find(ScreenName)iftemplateisNone:return8001else:template.Delete()exceptExceptionase:print(e)returnFUNCTION_END_WITH_ERRORreturnFUNCTION_END_WITHOUT_ERROR

Delete All Screen from folder

defDeleteAllScreensFromFolder(hmitarget,FolderName):'''Function to Delete the All Scrrens Locate on the folder Inside your HMI_RT

    Parameters
    ----------
    hmitarget:HmiTarget Objects
        The Object that you get from hwf.SoftwareContainer.
    FolderName:String
        The Name of folder that contatins the Screen which you want to delete.

    Returns
    ----------
    8000:
        Screen can not found inside the folder.
    8900:
        Screen is found, but Exception is happened while screen.Delete() executing.
    7000:
        Function is end without Error.

    '''try:folder=hmitarget.ScreenFolder.Folders.Find(FolderName)iffolderisNone:return8000else:screens=folder.Screensscreenlist=[]forscreeninscreens:screenlist.append(screen)forscreeninscreenlist:print('{} is deleted.'.format(screen.Name))screen.Delete()exceptExceptionase:print(e)returnFUNCTION_END_WITH_ERRORreturnFUNCTION_END_WITHOUT_ERROR

Delete Cycles

defDeleteCycle(hmitarget,CycleName):'''Function to Delete the Cycles Inside your HMI_RT

    Parameters
    ----------
    hmitarget:HmiTarget Objects
        The Object that you get from hwf.SoftwareContainer.
    Cycle:String
        The Name of cycles that  you want to delete.

    Returns
    ----------
    8000:
        Screen can not found inside the folder.
    8900:
        Screen is found, but Exception is happened while screen.Delete() executing.
    7000:
        Function is end without Error.

    '''try:cycles=hmitarget.Cyclescycle=cycles.Find(CycleName)ifcycleisNone:return8000else:print('{} is deleted.'.format(cycle.Name))cycle.Delete()exceptExceptionase:print(e)returnFUNCTION_END_WITH_ERRORreturnFUNCTION_END_WITHOUT_ERRORDeleteCycle(hmitarget,'Cycle_2')

Create Cycles

まず、CyclesをExportしたらこのようなXMLがあります。

<Hmi.Cycle.CycleID="0"><AttributeList><CycleTime>250</CycleTime><CycleUnit>Second</CycleUnit><Name>CYCLE TIME TEST</Name><StartAtStartingPoint>true</StartAtStartingPoint><StartingPoint>****-**-**T**:**:**</StartingPoint><TriggerAtShutdown>false</TriggerAtShutdown><TriggerAtStartup>false</TriggerAtStartup></AttributeList><ObjectList><MultilingualTextCompositionName="Comment"ID="1"><ObjectList><MultilingualTextItemCompositionName="Items"ID="2"><AttributeList><Culture>en-US</Culture><Text></Text></AttributeList></MultilingualTextItem></ObjectList></MultilingualText></ObjectList></Hmi.Cycle.Cycle>

その中に触る必要あるのは、CycleTime,CycleUnit,Nameかな?
なので、ElementTree XMLを使ってXMLの中身を編集し、TIAをへImportします。

importxml.etree.ElementTreeasETdefCreateHmiCycles(hmitarget,Name='Cycle_',CycleTime='1',CycleUnit='Second'):tree=ET.parse(IMPORT_HMI_PATH_CYCLES)root=tree.getroot()AttributeList=root.find('AttributeList')AttributeList.find('CycleTime').text=CycleTimeAttributeList.find('CycleUnit').text=CycleUniti,CycleName=1,NamewhileTrue:Cycle=hmitarget.Cycles.Find(CycleName)ifCycleisnotNone:CycleName=Name+'_'+str(i)i+=1print(CycleName)else:AttributeList.find('Name').text=CycleNamebreakifi>100:breaktree.write(IMPORT_HMI_PATH_CYCLES_TEMP)hmitarget.Cycles.Import(FileInfo(IMPORT_HMI_PATH_CYCLES_TEMP),ImportOptions.Override)CreateHmiCycles(hmitarget,'Cycle11',CycleTime='1')

はい、以上ですー


Viewing all articles
Browse latest Browse all 9701

Trending Articles