panic mode

MrPLC Admin
  • Content count

  • Joined

  • Last visited

Posts posted by panic mode

  1. the masking operation need to use AND, not XOR...

    XOR with 0xFF would change 'G' (value 0x47) to value 0xB8 which is not what you want. in fact one may probably want this value to be a non-zero since zero may be seen as end of string. so space character would likely be safe choice... (setting that would need an OR instruction)

    1 person likes this

  2. "it is simple" does not describe it... why don't you post your code and explain your test method or how to reproduce it?

    what is connected to X0 and X1?

    are you sure that logic is scanned?

    are you sure that M100 is not used anywhere else? 

    did you try some other bit instead of M100 to make sure it is unused?

  3. i have never uses that robot but based on quick internet search it seem to be a small robot arm (scara). btw. AWC board is not just an Etherent card... it is an entire motherboard (controller) with a lot of functionality. Did you follow the instructions in the manual on replacement?

    flash card is substitute for a HDD and contains OS etc.

    but key system settings (robot serial number, licenses etc.) are stored in NVRAM.

    when AWC is replaced, all settings need to be transferred, that includes flash card, NVRAM, address configuration...

    not sure what the "protection error" message is but may as well be complaint about missing license.


    Adept MV Controller.pdf

  4. you can have bunch of HMI buttons, each setting different bit in some memory area. at the end of PLC scan you can let PLC reset the entire area. for the rest of your PLC code, each of the bits will be seen as one shot. that will work rather nicely for plenty of cases and it is very efficient (no timers, very simple logic, no way to stay stuck etc.). if for some reason write message was missed, user would see no response and simply repeat pressing the same button. 

    but while simple, this does not work in all cases. an example is where you want to use button to jog axis (and releasing button is suppose to stop the jog). in that case one can resort to some alternative to make it robust. one simple way to get around this is to have HMI cyclically write entire block of memory. this way even if one message is missed and thus desired change is not seen by PLC, the very next message will overwrite the entire block and correct the situation. this is pretty much of how fieldbus data transfer works so all received signals seem to be continuous and instantaneous. this is also quick to implement when one is making custom HMI (a PC application using own driver or implementing just two functions of some SDK - read one memory block and write another...).

    but this is not how most HMIs work since it is limiting (all write requests need to be in one block). but typical controller may have many different memory areas (timer, counters, inputs, outputs, memory bits, data registers, retentive memory locations etc) they would normally send commands as individual writes to each individual location. so number, size and type of write messages would always differ.

    therefore one may dig into the bag of tricks and do something fancy depending on particular platform capabilities.

    and as you have already stated - if something is really critical, it should be handled as such and use more reliable solution. for example robots are making use of enabling switch (a safety device) allowing user to stop any motion command even if jog button was to fail. 

  5. maybe... did you check the instruction list?

    and you should always post your code and expectations. (resolution, time span, accuracy...)


    if i read this right you have a problem due summation since average is computed by:

    AVG(n) = (X1+X2+...Xn)/n

    it appears that you are attempting to store top side of the fraction into one variable and of course this will overflow pretty soon.

    solution to not do that... note that the very next average will be

    AVG(n+1) = (X1+X2+...Xn+1)/(n+1)

    but this can also be written as this (isolate last term)

    AVG(n+1) = (X1+X2+...Xn)/(n+1) + Xn+1/(n+1)


    AVG(n+1) = (AVG(n)*n + Xn+1)/(n+1)

    but that will overflow the same way as before due multiplication AVG(n)*n.

    however this can be rewritten as

    AVG(n+1) = AVG(n)*n/(n+1) + Xn+1/(n+1)

    where AVG(n) is previous average, Xn+1 is the latest sample, and "n+1" is the latest sample count.

    as long as you compute n/(n+1) before multiplying AVG(n), there should be no problem since n/(n+1) will grow but never exceed 1.

    ultimately this will settle at some average value since limit of  Xn/n goes to zero as n goes to infinity so adding more samples will just add zeroes and average will stop changing. 

    this begs question... are you really really sure you need total average over indeterminate and always increasing time interval and not average of several most recent samples? one would normally look at average only over fixed number of samples. that number can be small or large but it should be fixed.

    if you really want to cover "endless" interval, you need to define what is "endless".


    1 person likes this

  6. using half of the range is equivalent of loosing one bit. 0-5V is quarter of the range -10..10V so that would be reduction of 2 bits. i don't think that would make much of a difference for most applications. but if it is an issue one could add pair of resistors to form a voltage divider, that would allow use of up to 1/2 of range. still not worth the trouble in my opinion.

    NX-DA2603 : each channel has 8000 count over full range. (1/4 of that is 2000 counts)

    NX-DA2605 : each channel has 30000 count range (1/4 of that is 7500 counts)



  7. 2 hours ago, pszczepan said:

    As I wrote i did tick OFF and ON and nothing changed

    that is exactly opposite of what is in linked instructions and suggestions.

    when checkmark is set, function is disabled. 

  8. exactly, copy values to additional (and unused) memory locations to see what values are before and after subtraction. it should be an eye opener. you can remove this later. also check what other instruction writes to PlsActMemory.

    testing instructions to see exact behavior (and build experience and confidence) is also important. always do that on memory that is not used anywhere else. that way there is nothing ele that can change the instruction parameters and give you unexpected result. 

    1 person likes this

  9. "Firmware" is set of software loaded into product that is not user changeable. This is done by the "firm" (company) that makes hardware. Unless the firm releases flashing software and image to be loaded onto some product, there is nothing you can do.

    an example if firmware is PC BIOS. you do not create own BIOS to make the update but you may receive tools and image to upgrade BIOS after some critical bug was fixed - usually something involving security. 

    VFDs have firmware too and there is no reason for user to change it. same goes for your radio clock, garage door opener, microwave oven, TV or vacuum cleaner.

  10. exactly... COMx terminals here are the same thing as S/S terminal.

    btw the second image ("3. Examples of source input wiring") has correct circuit but wrong label next to sensor. it should say PNP sensor instead of NPN.