You could convert your bool array to a DINT(S) and write to the bits and an alarm is present if the DINT(S) > 0.
Nice and simple.
That wouldn't work if bit 31 was on, as the number would be negative. The test needs to be DINT(S) <> 0
But there's no getting away from the fact that BOOL Arrays, are not very friendly, you can't do much with them at all.
But if the BOOL Array is made a member of a UDT, you can then COP (or CPS) it into a DINT array of the same size, and you can do a whole lot more with DINT Arrays than you can with BOOL Arrays.
One way to detect a bit (or bits) ON, is to SUM the DINTs and test for a non-zero result. Ah, but there is no SUM instruction, no problem : AVG the DINT array and MUL by the length. But again, you will get caught out by the fact that DINTs are signed, so a +nnn in one DINT, and a -nnn in another will make the average zero, and hence the SUM will be zero also, even though there's loads of bits on.
If you have to know specifically which bit (or bits) are ON, most people just loop through the DINT array looking for non-zero elements, then loop through each non-zero DINT to find which bit is on. The equivalent bit index in the BOOL array would then be (DINT index * 32) + Bit index.
Unfortunately not available in Structured Text language, (but there's no reason you couldn't program an AOI in Ladder), is an instruction called DDT (Diagnostic Detect). This instruction is capable of recording
all bit positions that differ from a "reference" array, but be aware that if you want to capture all the differences you will need a Result array of DINTs the same size as your original BOOL array. Of course the reference array could be written into, for example to say "this alarm has been acknowledged". The possibilities are endless.