The following code creates a widget to operate Slt/Spk PLCs. In the meantime the features are available from online -tki itself ( to be invoked by a right-click on the motor name in the toplevel widget). However the code has been kept here to serve as an example.
$Spc::res_h{ blsc} = "spk1, other, devices";
$Spc::res_h{ spk1_title} = { text => "Spk1"};
$Spc::res_h{ spk1_help} = sub
{
Util::display_text( "Help Spk1",
'
State
0 ON
6 MOVING
Home
Starts the homing sequence
Toggle auto-refresh
If enabled, the menu items are updated every 2 seconds.
See current state of this flag is displayed in the
log widget of the toplevel menu, if it is changed.
'
)};
$Spc::res_h{ "spk1_io1"} = {
label => { name => "Position",
get => sub { sprintf "%g", Spectra::tng_attrDoubleRd( "spk1", "Position");}},
entry => { set => sub { Spectra::tng_attrDoubleWrt( "spk1", "Position", $_[0])}}};
$Spc::res_h{ "spk1_io2"} = {
label => { name => "Encoder Home Position",
get => sub { if( Spectra::tng_attrLongRd( "spk1", "FlagEncoderHomeDefined"))
{
sprintf "%g", Spectra::tng_attrDoubleRd( "spk1", "HomePosition");
}
else { "home not defined";}}},
entry => { set => sub { Spectra::tng_attrDoubleWrt( "spk1", "HomePosition", $_[0])}}};
$Spc::res_h{ "spk1_io3"} = {
label => { name => "FlagHomed",
get => sub { Spectra::tng_attrLongRd( "spk1",
"FlagEncoderHomed");}}};
$Spc::res_h{ "spk1_io4"} = {
label => { name => "State",
get => sub { Spectra::tng_state( "spk1");}}};
$Spc::res_h{ "spk1_io5"} = {
label => { name => "Error code",
get => sub { Spectra::tng_attrLongRd( "spk1", "ErrorCode");}}};
$Spc::res_h{ spk1_b1} = {
name => "Home",
command => sub { Spectra::tng_inout( "spk1", "MoveHome");}};
$Spc::res_h{ spk1_b2} = {
name => "ResetMotor",
command => sub { Spectra::tng_inout( "spk1", "ResetMotor");}};
$Spc::res_h{ spk1_b3} = {
name => "ClearError",
command => sub { Spectra::tng_inout( "spk1", "ClearError");}};
$Spc::res_h{ spk1_option1} = {
name => "Toggle auto-refresh",
command => sub { if( defined( $BLSC::h{ w_timer}))
{
$BLSC::h{ w_timer}->cancel();
delete $BLSC::h{ w_timer};
Util::log( "BLSC: timer cancelled");
}
else
{
$BLSC::h{ w_timer} =
$BLSC::h{ w_top}->after( 2000, \&BLSC::refresh);
Util::log( "BLSC: timer started");
}}};