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し操作を行う。
紹介
- TIA Portal Openness: Introduction and Demo Application
- Basic example on how to use openness with Python using Pythonnet
- Advantages & Disadvantages of Siemens' TIA Openness
ビデオ
- TIA Portal Openness - Generation of multiple customised projects, at the same time!
- TIA Portal Openness - Automatic project generation
- Openness - Efficient generation of program code using code generators
Manual
- SIMATIC Openness: Automating creation of projects
- TIA Portal Openness: Generating a Modular Machine with S7-1500
作業環境
- Python 3.7.1
- pythonnet
- Jupyter
インストールするときの不明点
プログラミングステップ
- TIA PortalをOpennessに連携できる環境を作る
- TIA Portalをアクセスのプログラム作る
- TIA PortalをアクセスのプログラムActivateし、TIA Portalをアクセスする
- TIA Portal起動する
- Projectを開く
- さまざまなコマンドを実行する
- Projectを保存・閉じる
- TIA Portalの間のアクセスを切断する
TIA Portal Openness Object Model
以下の図はObject Modelについて説明します。TIA PortalにF1を押しOpennessを検索すれば同じなものもでてきます。
Highest Level
GlobalLibrary
ProjectLibrary
HmiTarget
PlcSoftware
本来ならC# でプログラミングしないといけないですが、ここでpythonnetを使ってOpennessのdllを読み込んでPythonでやりたいと思います。
実装
プロジェクト作成
以下はProject_testというProjectをC:\tiav15_1_projectに作ることができます。
(もし同じ名前のプロジェクトも既にあるだと例外が発生します。)
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)プロジェクト開く
以下はプロジェクトを開くのコードです。
(もし該当プロジェクト既に開いてるのあれば例外が発生します。)
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常に見えるようにする設定:
そのCheckBox入れると、Hardware Catalogの表示はこんな風に変わります:
Device追加
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)NetworkView
myproject.ShowHwEditor(tia.HW.View.Network)Device view
myproject.ShowHwEditor(tia.HW.View.Device)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プロジェクトコンパイル
importSiemens.Engineering.CompilerascpsoftwareComp=software.GetService[cp.ICompilable]()softwareComp.Compile()BlockとBlockグループ
Blockグループもらう
BlockGroup=software.BlockGroupBlockグループにある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)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)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)PLC操作
Online
fromSiemens.Engineering.OnlineimportOnlineProviderplc=myproject.Devices[0]plc1=plc.DeviceItems[1]plc_online=plc1.GetService[OnlineProvider]()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))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)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作成
#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.TechnologicalObjectsimportTechnologicalInstanceDBfromSystemimportVersionasvrPID_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
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].NameObjectのパラメータ設定
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=105PLCと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])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]().SoftwareCreate 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_ERRORDelete 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_ERRORDelete 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_ERRORDelete 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')はい、以上ですー





















