[9bc435]: / readme.md  Maximize  Restore  History

Download this file

207 lines (197 with data), 11.2 kB

This project is for the ASCII Art Ladder
It converts PLCOpenXML files of ladder POUs exported from CODESYS into a beautiful ASCII Art
It will initially use:
CODESYS Ladder Editor
CODESYS PLCOpenXML Export
CODESYS Scripting Engine / IronPython
Python XML
Some new ASCII Ladder format defined in this project

Step 1: User will create the ladder in CODESYS Ladder Editor.
User will compile the ladder without any errors.

Step 2: User will export just one single ladder routine to PLCOpenXML

Step 3: User will run the PLCOpenXMLLadderToASCIILADDER.py script, with the correct arguments

Step 4: The script will look for a declaration header as plain text and save this

Step 5: The script will read every subelement of <ld>.
Ones it can't understand will be put in an exceptions tag</ld>

Step 6: The script will arrange all of the ladder elements into rows and columns.
This new element array will also list branches in down / in up / out down / out up

Step 7: The script will write each row and column to a text file in ASCII Art Ladder format

Step 8: The script will list all truncated names, and complete all truncated EXECUTE blocks

Example File Output:

//This is a rung comment
(Also a
rung comment
)
(Mabe a nicer
* Way to do multiline comments
*)
(
supported features:
* 001 ‘Network’
* 002 ‘Box’
* 002 ‘Assignment’
* (003 FB, 003 FN) ‘Box with EN/ENO’
* 002 ‘Input’
* 005 ‘Label’
* 005 ‘Contact’
* 005 ‘Coil’
* 005 Negated Contant
* 006 Branches (note, branches always close!)
* 007 Set coil
* 007 Reset coil
* 008 short circuit evaluation (SCE) (Toggle Parallel Mode) (I dislike this enough I make you use extended ascii)
* 008 Negation (I dislike this enough I make you use extended ascii)
* 009 Jump
* 010 Return
* 011 Network Comment State
* 012 FBD/LD/IL Element ‘Execute’
* 013 Names are too long (abreviation section)
* I think that's everything actually.
)
(
Declaration Section:
* Exact copy of the declaration section, with some indentation
* Note any indentation that is the same for each line will be removed
)
{Declaration}
PROGRAM POU
VAR
END_VAR
{/Declaration}
( Abbreviation Section:
* Sure it can get confusing. Maybe later can alter it so not fixed width ladder
* For importing, it is OK to change the abbrevioations however you please
* Rules: Generally if too long:
* take first three letters and last three and add a ~0 through ~9
* If more than 10 have same first three and same last three, the 11th becomes ~~10
* If there is one or more points in the variable name, shorten the first three and but the point before the ~
*)
{Abbreviaitons}
Nam~0GHT := NameEIGHT;
Nam~1GHT := NameONE_HUNDRED_AND_EIGHT;
Nam~2GHT := NameI_CANT_WEIGHT;
F_C~0ate := F_Calculate;
FB.~0ate := FB_Timer.Calculate;
{/Abbreviations}
(
Execution Section:
* If the execution block is too big to fit,
* either width ways or column ways, write it's Execution here.
* Note any indentation that is the same for each line will be removed
*)
{Executions}
{~1}
thisvariable := actuallyToolong;
REsult := Function();
//I added a comment
//If line too long it gets truncated
// >6 line, ~ bottom right
IF TRUE THEN
DoSomethingCool;
END_IF;
{/~1}
{/Executions}
{Ladder}
001 ||. . . . . . ||
|| ||
||------------------------------------------------------------||
|| ||
002 ||. . . _ . ||
|| NameEIGH | F_Name | NameEIGH ||
||----] [------------------------Input_01|--------------( )---||
|| Variable==In_out01| ||
|| =InOut2 | ||
|| Variable--Input2 | ||
|| =InOut3 | ||
|| | Out01--Variable ||
|| | Out02--Variable ||
|| |_| ||
|| ||
003 ||. . . _
. ||
|| NameEIGH NameEIGH Instance--FB_Name8| NameEIGH ||
||----]
[-------] [--------------EN ENO---------------( )---||
|| -Input01 | ||
|| | Out01- ||
|| =In_out01| ||
|| =Inout2 | ||
|| |_| ||
|| ||
004 ||. . . _
. ||
|| NameEIGH | F_Name | NameEIGH ||
||----]
[------------------------EN ENO---------------( )---||
|| Variable--Input01 | ||
|| | Out01--Variable ||
|| Variable==In_out01| ||
|| Variable==Inout2 | ||
|| |__| ||
|| ||
005 ||. . . . . . ||
myLabel || NameEIGH NameEIGH NameEIGH ||
||----]
[-------]/[-------------------------------------( )---||
|| ||
006 ||. . . . . . ||
|| NameEIGH NameEIGH NameEIGH ||
||+---]
[--++---] [------------+------------------------( )---||
||| || | ||
||| || . | ||
|||NameEIGH||NameEIGH NameEIGH| ||
||+---]
[--++---] [-------]/[--+ ||
|| ||
007 ||. . . . . . ||
|| NameEIGH NameEIGH NameEIGH ||
||----------------------------------(R)-------(S)---+---(S)--+||
|| | |||
|| | |||
|| |NameEIGH|||
|| +---(R)--+||
|| ||
008 ||. . . . . . ||
|| NameEIGH ASCII181 NameEIGH ||
||----]
[---╬---] [--------------------------------╬----( )---||
|| ║ ║ ||
|| ║ . __ ║ ||
|| ║ASCII206 Instance--FB_Name8| ║ ||
|| ╬---]
[--------------EN ENO----------╬ ||
|| NegInVarø-Input01 | ||
|| | Out01-øASCII155 ||
|| =In_out01| ||
|| =Inout2 | ||
|| |__| ||
|| ||
009 ||. . . . . . ||
|| myLabel ||
||----------------------------------------------------<jump>--||
|| ||
010 ||. . . . . . ||
|| ||
||---------------------------------------------------<return>-||
|| ||
011 ||##. . . . . . ||
||## NameEIGH ||
||##----]</return></jump>
[--------------------------------------------<return>-||
||## ||
012 ||. . . ________ . ||
|| NameEIGH | Execute ~1 | ||
||----]</return>
[---------------EN ENO------------||
|| |thisvariable := actuallyT~| ||
|| |REsult := Function(); | ||
|| |//I added a comment | ||
|| |//If line too long it get~| ||
|| |// >6 line, ~ bottom right| ||
|| |IF TRUE THEN | ||
|| |____~| ||
|| ||
013 ||. . .
_____ . ||
|| FB.~0ate Nam~1GHT |F_C~0ate| Nam~2GHT ||
||----]
[---+---] [--------------EN ENO----------+----( )---||
|| | NegInVarø-Input01 | | ||
|| | | Out01-øASCII155| ||
|| | =In_out01| | ||
|| | =Inout2 | | ||
|| | |_| | ||
|| | . _
| ||
|| |Nam~0GHT Instance--FB_Timer| | ||
|| +---]
[--------------EN ENO----------+ ||
|| NegInVarø-Input01 | ||
|| | Out01-øASCII155 ||
|| =In_out01| ||
|| =Inout2 | ||
|| |_
| ||
|| ||
{/Ladder}